HarmonyOS UltimateProvider简单快速的使用ListContainer而不需要写Provider。此框架是CHGAdapter的鸿蒙版本


UltimateProvider(适配器)简单快速的使用ListContainer而不需要写Provider。此框架是CHGAdapter的鸿蒙版本

UltimateProvider

UltimateProvider(Adapter)简单快速的使用ListContainer而不需要写Provider。此框架是CHGAdapter的鸿蒙版本

安卓(CHGAdapter)

Java:https//github.com/chenhaigang888/CHGAdapter_android

Kotlin:https//github.com/chenhaigang888/CHGAdapter_Kotlin

ios(CHGAdapter)

oc:https://github.com/chenhaigang888/CHGAdapter

迅捷:https://github.com/chenhaigang888/CHGAdapter_swift

HarmonyOS(UltimateProvider)

java:https//github.com/chenhaigang888/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 songer; public SongViewHolder(EventTransmissionListener eventTransmissionListener, Component component, UltimateProvider provider) { super(eventTransmissionListener, component,provider); icon = (Image) findComponentById(ResourceTable.Id_icon); songName = (Text) findComponentById(ResourceTable.Id_songName); songer = (Text) findComponentById(ResourceTable.Id_songer); } @Override public void onDataBound() { songName.setText(getModel().getName()); songer.setText(getModel().getSinger()); } }

效果1:


2.简单的显示(显示多种布局)

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; } }

文件AlbumModel.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); } @Override public void onDataBound() { name.setText(getModel().getName()); songer.setText(getModel().getSonger()); } }

效果2:


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<MusicModel> { 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:


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<Model>(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<PlayListItemModel> { 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());//这里把状态存储在数据中,可以根据需求将状态存储在provider中的自定义数据中。具体使用方式可以查看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);//这里把状态存储在数据中,可以根据需求将状态存储在provider中的自定义数据中。具体使用方式可以查看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);//这里把状态存储在数据中,可以根据需求将状态存储在provider中的自定义数据中。具体使用方式可以查看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:


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:


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容