RecyclerView的超强辅助Graywater——综合实操篇

news/2024/11/24 6:16:39/

关于Graywater的系列文章

  1. RecyclerView的超强辅助Graywater——理论篇
  2. RecyclerView的超强辅助Graywater——基础实操篇
  3. RecyclerView的超强辅助Graywater——点击事件
  4. RecyclerView的超强辅助Graywater——综合实操篇

看到上一篇Graywater文章是11月8日写的,也是拖很久了,这篇是Graywater系列文章最后一篇完结篇,把自己挖的坑给填了。

这篇文章是Graywater综合练习文章,包括了复杂视图的实现,基本增删改功能的实现,文末附有Demo地址,同样Demo也只是起一个抛砖引玉的作用,实际上还有很大的延展空间。

先上Demo效果图:

GraywaterDemo综合.gif

老规矩,还是先说说本文目录:

1. 复杂视图的实现
2. 数据的插入
3. 数据的删除
4. 数据的更新
5. 注意点

1. 复杂视图的实现

从GIF图中可以看到,该RecyclerView分为2大模块,娱乐新闻模块和体育新闻模块,每个模块对应一个数据源Primitive和一个管理器ItemBinder,数据源就对应了该模块所有数据内容,管理器对该模块所有视图进行管理。

比如娱乐新闻模块对应了一个EntertainPrimitive和EntertainItemBinder,包含了该模块的所有数据,同时还包含了娱乐新闻标题Binder和娱乐新闻内容的Binder(娱乐新闻内容的Binder使用List集合保存)。

GraywaterDemo模块图.png

接着往下看,在RecyclerView里有3种视图:标题视图、娱乐新闻视图、体育新闻视图。每种视图都有一组自己对应的Binder、ViewHolder和ViewHolderCreator以及自己的布局文件。

看看实现娱乐新闻视图的核心代码:
EntertainItemBinder.java

    @NonNull@Overridepublic List<GraywaterAdapter.Binder<? super EntertainPrimitive, ? extends PrimitiveViewHolder>> getBinderList(@NonNull final EntertainPrimitive model, int position) {return new ArrayList<GraywaterAdapter.Binder<? super EntertainPrimitive, ? extends PrimitiveViewHolder>>() {{add(titleBinder);  //添加娱乐新闻标题for (EntertainItem entertainItem : model.getEntertainItems()) {add(entertainBinder);    //添加娱乐新闻内容}}};}

所以在ItemBinder中可以添加多种类型的binder,就可以实现不同的视图了。

2. 数据的插入

插入娱乐新闻的核心代码:

      @Overridepublic void onClickaddNews(String type) {Toast.makeText(this, "add " + type + " success", Toast.LENGTH_SHORT).show();switch (type) {case TYPE_ENTERTAIN:addEntertainNews();mPrimitiveAdapter.remove(POS_ENTERTAIN);mPrimitiveAdapter.add(POS_ENTERTAIN, mEntertainPrimitive);//不需要mPrimitiveAdapter.notifyDataSetChanged();在add()方法中已经包含了更新操作break;case TYPE_SPORT:addSportNews();mPrimitiveAdapter.remove(POS_SPORT);mPrimitiveAdapter.add(POS_SPORT, mSportPrimitive);break;}}    private void addEntertainNews() {if (entertainItems == null) {entertainItems = new ArrayList<>();}EntertainItem entertain = new EntertainItem();entertain.setId("" + (entertainItems.size() + 1));entertain.setUrl("https://img8.ccnxs.cn/uploadfile/hbase/201901/0129/HBC5C4FABFA51855.png");entertain.setTitle("item " + (entertainItems.size() + 1) + " : " + "胡海泉独自现身丽江 面带微笑任拍照");entertainItems.add(entertain);}

3. 数据的删除

删除娱乐新闻的核心代码:

    @Overridepublic void onClickDeleteEntertain(EntertainItem entertain) {boolean needRefresh = false;Iterator iterator = entertainItems.iterator();while (iterator.hasNext()) {EntertainItem entertainItem = (EntertainItem) iterator.next();if (entertainItem.getId().equals(entertain.getId())) {iterator.remove();needRefresh = true;break;}}if (needRefresh) {mPrimitiveAdapter.remove(POS_ENTERTAIN);mPrimitiveAdapter.add(POS_ENTERTAIN, mEntertainPrimitive);}}

4. 数据的更新

更新娱乐新闻的核心代码:

点击娱乐新闻跳转到编辑页进行编辑,编辑成功返回MainActivity,在onActivityResult()方法中进行处理,实际上娱乐新闻和体育新闻的编辑是不应该放在同一个编辑页的,我这里图方便就写在一起了。

    @Overridepublic void onClickEditEntertain(EntertainItem entertain) {Intent intent = new Intent(this, EditActivity.class);intent.putExtra("type", TYPE_ENTERTAIN);intent.putExtra("obj", entertain);startActivityForResult(intent, 11);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (resultCode) {case 100:String type = data.getStringExtra("type");if (MainActivity.TYPE_ENTERTAIN.equals(type)) {updateEntertainItem((EntertainItem) data.getSerializableExtra("obj"));} else {updateSportItem((SportItem) data.getSerializableExtra("obj"));}break;}}private void updateEntertainItem(EntertainItem item) {boolean needRefresh = false;Iterator iterator = entertainItems.iterator();while (iterator.hasNext()) {EntertainItem entertainItem = (EntertainItem) iterator.next();if (entertainItem.getId().equals(item.getId())) {entertainItem.setTitle(item.getTitle());needRefresh = true;break;}}if (needRefresh) {mPrimitiveAdapter.remove(POS_ENTERTAIN);mPrimitiveAdapter.add(POS_ENTERTAIN, mEntertainPrimitive);}}

5. 注意点

· binderIndex

看一下娱乐新闻内容EntertainBinder中的关键代码

    @Overridepublic void bind(@NonNull EntertainPrimitive model, @NonNull EntertainViewHolder holder, @NonNull List<GraywaterAdapter.Binder<? super EntertainPrimitive, ? extends EntertainViewHolder>>binders, int binderIndex, @NonNull GraywaterAdapter.ActionListener<EntertainPrimitive, EntertainViewHolder> actionListener) {EntertainItem entertain = model.getEntertainItems().get(binderIndex - 1);  //因为第一个数据是新闻标题,所以新闻内容数据获取时要减一Picasso.get().load(entertain.getUrl()).placeholder(R.mipmap.ic_launcher).into(holder.getImg());holder.getTitle().setText(entertain.getTitle());holder.getmActionListenerDelegate().update(actionListener, model, holder, binders, binderIndex, null);holder.getMainLayoutView().setOnClickListener(holder.getmActionListenerDelegate());holder.getDelete().setOnClickListener(holder.getmActionListenerDelegate());}

注意这句代码:

EntertainItem entertain = model.getEntertainItems().get(binderIndex - 1);

有没有疑惑为什么要binderIndex要减1?上文也提到EntertainItemBinder是对标题和内容统一进行管理,而binderIndex返回的是binder的下标。看一下断点截图就明白了:

断点.png

因为包含了标题TitleBinder,所以第一条新闻内容对应的binderIndex对应的下标是1,但新闻内容的数据集合与新闻标题的数据是相互独立,没有关系的,所以第一条新闻内容在数据集合中的位置是0,所以binderIndex需要减1。

补充:

  • GraywaterPrimaryDemo Github地址

如果对你有帮助的话,点赞、评论都是对我的鼓励,也是支持我写下去的动力,谢谢!


http://www.ppmy.cn/news/196438.html

相关文章

华为鸿蒙拍照,华为首部鸿蒙手机P50来了!顶级拍照再升级,麒麟芯片或绝唱……...

最强拍照 全新鸿蒙&#xff0c;华为新旗舰要来了&#xff01; 华为高管宣称&#xff0c;明年华为将发布基于鸿蒙系统的手机。此言一出&#xff0c;大家不禁把目光转向了华为明年的第一款旗舰智能手机P50。 高管的话显然在暗示 P50 系列或许会抛弃安卓系统转而拥抱鸿蒙 OS。尽管…

华为鸿蒙拍照,顶级拍照+全新鸿蒙双重BUFF加持,华为P50会有多强?

原标题&#xff1a;顶级拍照全新鸿蒙双重BUFF加持&#xff0c;华为P50会有多强&#xff1f; 作者&#xff1a;攒蘑菇的小提莫 最强拍照全新鸿蒙&#xff0c;华为新旗舰要来了&#xff01; 华为高管宣称&#xff0c;明年华为将发布基于鸿蒙系统的手机。此言一出&#xff0c;大家…

android 小米拍照功能,iQOO和小米9到底拍照谁更强之iQOO手机拍照功能详细评测

iQOO和小米9到底拍照谁更强之iQOO手机拍照功能详细评测 2019-04-02 10:51:35 8点赞 13收藏 20评论 iQOO作为vivo子品牌一上市就以超强配置和超高性价比引爆市场&#xff0c;作为一款超高性价比手机拍照性能到底如何那&#xff0c;下面就来和大家聊聊iQOO的后置三摄。 iQOO后置竖…

练就超强记忆力,成为最强大脑【完结】

练就超强记忆力&#xff0c;成为最强大脑【完结】┼shidian8848 00发刊词&#xff1a;第0章 练就超强记忆力&#xff0c;让你学习工作更如意.mp3 00发刊词&#xff1a;第0章 练就超强记忆力&#xff0c;让你学习工作更如意.pdf 第01课&#xff1a;1.课前记忆测试&#xff1a;你…

Java超强面试题

Java程序员面试题集&#xff08;1-50&#xff09; 一、Java基础部分 1、面向对象的特征有哪些方面? 答&#xff1a;面向对象的特征主要有以下几个方面&#xff1a; 1)抽象&#xff1a;抽象是将一类对象的共同特征总结出来构造类的过程&#xff0c;包括数据抽象和行为抽象两方面…

win10 1050Ti 笔记本配置 TensorFlow-gpu 过程(多图超详细)

目录 写在前面 一、安装步骤 1. 安装Visual Studio 2015 社区版 2. 安装CUDA&#xff08;重要&#xff09; CUDA安装失败的解决方法 关于CUDA安装的说明 3. 安装Anaconda 4. 安装cuDNN 5. 安装TensorFlow-gpu 验证TensorFlow是否安装成功 6. Pycharm配置tensorflow …

笔记本win10 64位 1050Ti显卡 安装Anaconda3.4.2.0 (python3.5版)+tensorflow gpu版

本文是对笔记本win10 64位 1050Ti显卡下 安装Anaconda3.4.2.0 &#xff08;python3.5版&#xff09;tensorflow的说明&#xff1a; 安装版本&#xff1a;推荐Anaconda 3-4.2.0(自带python3.5版本&#xff09;&#xff0c;cuda9.0、cudnn-9.0-windows10-x64-v7.4.1.5、vs_commu…

折腾kali2020.1:(一)安装kali系统及nvidia 1050Ti显卡驱动

kali 折腾kali2020.1&#xff1a;&#xff08;一&#xff09;安装kali系统及nvidia 1050Ti显卡驱动安装架构为什么采用这种方式呢&#xff1f; 一、下载二、安装安装过程的坑&#xff1a;1、坑死广大小白的安装软件包过程中的报错&#xff0c;元凶在网络&#xff01; 2、安装成…