1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/chenhaigang-UltimateProvider

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

UltimateProvider

UltimateProvider (Adapter) позволяет быстро и просто использовать ListContainer без необходимости писать Provider. Эта структура является версией CHGAdapter для HarmonyOS.

Android (CHGAdapter)

iOS (CHGAdapter)

HarmonyOS (UltimateProvider)

Если у вас есть вопросы или вы хотите пообщаться, пожалуйста, присоединяйтесь к QQ группе: 494648687.

Пример:

  1. Простое отображение (отображение одного макета):
  • Файл SongSlice.java:
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;
    }
}
  • Файл SongModel.java (модель):
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;
    }}
  • Файл SongViewHolder.java (модель):
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:

UltimateProvider

  1. Простое отображение (отображение нескольких макетов):
  • RecommendSlice.java:
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;
    }

}
  • АльбомModel.java (модель):
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;
    }
}
  • AlbumViewHolder.java:
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); }

/**

  • Одновременно отображает интерфейс входа и верификации личности
  • @return */ public List getAllView() { List list = new ArrayList(); list.add(new OneTitleModel("Вход")); list.add(new InputBoxModel("Имя пользователя:","","Пожалуйста, введите имя пользователя",false)); list.add(new InputBoxModel("Пароль:","","Пожалуйста, введите пароль",true)); list.add(new SubmitBtnModel("Войти")); return list; }

@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 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/chenhaigang-UltimateProvider.git
git@api.gitlife.ru:oschina-mirror/chenhaigang-UltimateProvider.git
oschina-mirror
chenhaigang-UltimateProvider
chenhaigang-UltimateProvider
master