UltimateProvider
UltimateProvider (Adapter) позволяет быстро и просто использовать ListContainer без необходимости писать Provider. Эта структура является версией CHGAdapter для HarmonyOS.
Android (CHGAdapter)
iOS (CHGAdapter)
HarmonyOS (UltimateProvider)
Если у вас есть вопросы или вы хотите пообщаться, пожалуйста, присоединяйтесь к QQ группе: 494648687.
Пример:
public class SongSlice extends AbilitySlice {
private ListContainer listContainer;
@Override
protected void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_song);
listContainer = (ListContainer) findComponentById(ResourceTable.Id_listContainer);
listContainer.setItemProvider(new UltimateProvider(getSongs(),getContext()));
}
List getSongs(){
List list = new ArrayList();
for (int i=0; i<100; i++) {
list.add(new SongModel("歌曲名称:"+i,"歌手:"+i));
}
return list;
}
}
public class SongModel implements Model {
private String name;
private String singer;
@Override
public int getResources(int position) {
return ResourceTable.Layout_song_item;
}
@Override
public Class getHolderClass(int position) {
return SongViewHolder.class;
}}
public class SongViewHolder extends ViewHolder<SongModel> {
private Image icon;
private Text songName;
private Text singer;
public SongViewHolder(EventTransmissionListener eventTransmissionListener, Component component, UltimateProvider provider) {
super(eventTransmissionListener, component,provider);
icon = (Image) findComponentById(ResourceTable.Id_icon);
songName = (Text) findComponentById(ResourceTable.Id_songName);
singer = (Text) findComponentById(ResourceTable.Id_singer);
}
@Override
public void onDataBound() {
songName.setText(getModel().getName());
singer.setText(getModel().getSinger());
}
}
Эффект 1:
public class RecommendSlice extends AbilitySlice {
private ListContainer listContainer;
@Override
protected void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_recommend);
listContainer = (ListContainer) findComponentById(ResourceTable.Id_listContainer);
listContainer.setItemProvider(new UltimateProvider<Model>(getData(),getContext()));
}
List getData(){
List list = new ArrayList();
for (int i=0; i<100; i++) {
if (i %2 == 0) {
list.add(new SongModel("歌曲名称:"+i,"歌手名称:"+i));
} else {
list.add(new AlbumModel("专辑名称:"+i,"歌手"));
}
}
return list;
}
}
public class AlbumModel implements Model {
private String name;
private String songer;
@Override
public int getResources(int position) {
return ResourceTable.Layout_album_item;
}
@Override
public Class getHolderClass(int position) {
return AlbumViewHolder.class;
}
}
public class AlbumViewHolder extends ViewHolder<AlbumModel> {
private Text name;
private Text songer;
public AlbumViewHolder(EventTransmissionListener eventTransmissionListener, Component component, UltimateProvider provider) {
super(eventTransmissionListener, component,provider);
name = (Text) findComponentById(ResourceTable.Id_name);
songer = (Text) findComponentById(ResourceTable.Id_songer);
}
``` **onDataBound() {**
name.setText(getModel().getName());
songer.setText(getModel().getSonger());
**}**
#### 3. Вложенный ListContainer
- NestedListAbility.java
public class NestedListSlice extends AbilitySlice {
private ListContainer listContainer;
@Override
protected void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_nested_list);
listContainer = (ListContainer) findComponentById(ResourceTable.Id_listContainer);
listContainer.setItemProvider(new UltimateProvider<Model>(getData(), getContext()));
}
List getData() {
List list = new ArrayList();
for (int i=0; i<100; i++) {
if (i%5 == 0) {
list.add(new SongModel("歌曲名称:"+i,"歌手:"+i));
} else if (i%5 == 1) {
list.add(new AlbumModel("推荐专辑:"+i,"歌手:"+i));
} else if (i%5 == 2) {
list.add(creageMusicData(i,i%2));
} else {
list.add(creageHybridData());
}
}
return list;
}
/*Создание рекомендованного контента*/
MusicModel creageMusicData(int position,int type){
List list = new ArrayList();
String title = type == 0 ? "Рекомендованная песня":"Рекомендованный альбом";
for (int i=0; i< 100; i++) {
if (type == 0) {
list.add(new NestedSongModel("Рекомендованная песня:"+i,"Исполнитель:"+i));
} else if(type == 1){
list.add(new NestedAlbumModel("Рекомендованный альбом:"+i,"Исполнитель:"+i));
}
}
return new MusicModel(title + position,list);
}
/*Создание рекомендованного контента*/
MusicModel creageHybridData(){
List list = new ArrayList();
for (int i=0; i< 100; i++) {
if (i %2 == 0) {
list.add(new NestedSongModel("Рекомендованная песня:"+i,"Исполнитель:"+i));
} else {
list.add(new NestedAlbumModel("Рекомендованный альбом:"+i,"Исполнитель:"+i));
}
}
return new MusicModel("Рекомендованные песни и альбомы",list);
}
}
- Файл MusicModel.java модель
public class MusicModel implements Model {
private String title;
private List data;
@Override
public int getResources(int position) {
return ResourceTable.Layout_music_item;
}
@Override
public Class getHolderClass(int position) {
return MusicViewHolder.class;
}
}
- Файл MusicViewHolder.java
public class MusicViewHolder extends ViewHolder {
private Text title;
private ListContainer listContainer;
private UltimateProvider ultimateProvider;
public MusicViewHolder(EventTransmissionListener eventTransmissionListener, Component component,UltimateProvider provider) {
super(eventTransmissionListener, component,provider);
title = (Text) findComponentById(ResourceTable.Id_title);
listContainer = (ListContainer) findComponentById(ResourceTable.Id_listContainer);
ultimateProvider = new UltimateProvider(null,getContext());
}
@Override
public void onDataBound() {
title.setText(getModel().getTitle());
ultimateProvider.setModels(getModel().getData());
listContainer.setItemProvider(ultimateProvider);
}
}
Эффект 3:
<video src="https://github.com/chenhaigang888/UltimateProvider/blob/master/v3.mp4" controls="controls">
Ваш браузер не поддерживает видео тег.
</video>
#### 4.ItemView с кнопками и другими событиями
- EventHanlderAbility.java
public class EventHanlderSlice extends AbilitySlice { private ListContainer listContainer; static final HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, 0x00201, "MY_TAG"); @Override protected void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_event_hanlder); listContainer = (ListContainer) findComponentById(ResourceTable.Id_listContainer); UltimateProvider ultimateProvider = new UltimateProvider(getData(), getContext());
listContainer.setItemProvider(ultimateProvider);
/* Здесь используется анонимный внутренний класс для реализации, также можно позволить Slice реализовать интерфейс EventTransmissionListener */ ultimateProvider.setEventTransmissionListener(new EventTransmissionListener() { @Override public Object onEventTransmission(Object target, Object params, int eventId, CallBack callBack) { if (target instanceof PlayListItemViewHolder) { if (eventId == 1) { // Воспроизведение списка было нажато, демонстрация синхронного возврата данных return handlePlayStatus(target, params, eventId, callBack); } else if (eventId == 2) { // Коллекция return handleCollectionStatus(target, params, eventId, callBack); } } return null; } }); }
/* Обработка состояния воспроизведения музыки в ItemView (демонстрация синхронного возврата данных) */ public Object handlePlayStatus(Object target, Object params, int eventId, EventTransmissionListener.CallBack callBack) { boolean playStatus = (boolean) params; return !playStatus; // Изменить статус воспроизведения и вернуть }
/* Обработка статуса воспроизведения музыки в ItemView (демонстрация асинхронного возврата данных) / public Object handleCollectionStatus(Object target, Object params, int eventId, EventTransmissionListener.CallBack callBack) { boolean collectionStatus = (boolean) params; / Здесь можно выполнить некоторые длительные операции, такие как отправка текущего статуса коллекции музыки на сервер, а затем сервер возвращает результат через callBack обратно в список для обновления статуса / / Длительная операция опущена */ callBack.callBack(!collectionStatus); // Использовать асинхронный возврат return null; }
/* Создание данных */ public List getData() { List list = new ArrayList(); for (int i = 0; i < 100; i++) { list.add(new PlayListItemModel("Название песни: " + i, "Имя исполнителя: " + i)); } return list; }
- Файл `PlayListItemModel.java` модель:
public class PlayListItemModel implements Model { /* Название песни / private String name; / Исполнитель / private String songer; / Нравится ли / private boolean love = false; / Собрано ли / private boolean collection = false; / Воспроизводится ли */ private boolean play = false;
@Override
public int getResources(int position) {
return ResourceTable.Layout_play_list_item;
}
@Override
public Class getHolderClass(int position) {
return PlayListItemViewHolder.class;
}
}
- Файл `PlayListItemViewHolder.java`:
public class PlayListItemViewHolder extends ViewHolder { private Image icon; private Text name; private Text songer; private Text love; private Text collection; private Text play;
public PlayListItemViewHolder(EventTransmissionListener eventTransmissionListener, Component component, UltimateProvider provider) {
super(eventTransmissionListener, component, provider);
icon = (Image) findComponentById(ResourceTable.Id_icon);
name = (Text) findComponentById(ResourceTable.Id_name);
songer = (Text) findComponentById(ResourceTable.Id_songer);
love = (Text) findComponentById(ResourceTable.Id_love);
collection = (Text) findComponentById(ResourceTable.Id_collection);
play = (Text) findComponentById(ResourceTable.Id_play);
love.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
// Обработка содержимого события клика
getModel().setLove(!getModel().isLove()); // Здесь состояние сохраняется в данных, и его можно сохранить в пользовательских данных провайдера в соответствии с требованиями. Конкретный способ использования можно посмотреть в CustomData.
notifyCurrentDataSetItemChanged();
}
});
play.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
// Передать событие в Slice и затем синхронно вернуть результат
boolean play = (boolean) getEventTransmissionListener().onEventTransmission(PlayListItemViewHolder.this, getModel().isPlay(), 1, null);
getModel().setPlay(play); // Здесь состояние сохраняется в данных, и его можно сохранить в пользовательских данных провайдера в соответствии с требованиями. Конкретный способ использования можно посмотреть в CustomData.
notifyCurrentDataSetItemChanged();
}
});
collection.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
getEventTransmissionListener().onEventTransmission(PlayListItemViewHolder.this, getModel().isCollection(), 2, new EventTransmissionListener.CallBack() {
@Override
public Object callBack(Object object) {
boolean collection = (boolean) object;// Здесь activity должна возвращать значение типа boolean, чтобы соответствовать требуемым данным
getModel().setCollection(collection);// Здесь состояние сохраняется в данных, и его можно сохранить в пользовательских данных провайдера в соответствии с требованиями. Конкретный способ использования можно посмотреть в CustomData.
notifyCurrentDataSetItemChanged();
return null;
}
});
}
@Override
public void onDataBound() {
name.setText(getModel().getName());
songer.setText(getModel().getSonger());
// Для экономии времени следующие состояния представлены текстом вместо изображений.
love.setText(getModel().isLove() ? "нравится":"не нравится");
collection.setText(getModel().isCollection() ? "собрано":"не собрано");
play.setText(getModel().isPlay() ? "воспроизвести":"не воспроизводить");
}
}
**Эффект 4:**
<video src="https://github.com/chenhaigang888/UltimateProvider/blob/master/v4.mp4" controls="controls">
Ваш браузер не поддерживает видеотег.
</video>
#### **5. События нажатия кнопок и другие события в ItemView**
- CustomDataUserAbility.java
public class CustomDataUserSlice extends AbilitySlice implements EventTransmissionListener{
private ListContainer listContainer; private UltimateProvider ultimateProvider; private LoginData loginData = new LoginData();// Используется для хранения имени пользователя и пароля
@Override protected void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_custom_data_use); listContainer = (ListContainer) findComponentById(ResourceTable.Id_listContainer); ultimateProvider = new UltimateProvider(getAllView(),getContext()); listContainer.setItemProvider(ultimateProvider); ultimateProvider.setCustomData(loginData);// Демонстрация установки пользовательских данных, здесь в основном записываются введенные имя пользователя и пароль ultimateProvider.setEventTransmissionListener(this); }
/**
@Override public Object onEventTransmission(Object target, Object params, int eventId, CallBack callBack) {
return null; } }
**Эффект 5:**
<video src="https://github.com/chenhaigang888/UltimateProvider/blob/master/v5.mp4" controls="controls">
Ваш браузер не поддерживает видеотег.
</video>
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )