RecyclerView的超强辅助Graywater——综合实操篇
关于Graywater的系列文章
- RecyclerView的超强辅助Graywater——理论篇
- RecyclerView的超强辅助Graywater——基础实操篇
- RecyclerView的超强辅助Graywater——点击事件
- RecyclerView的超强辅助Graywater——综合实操篇
看到上一篇Graywater文章是11月8日写的,也是拖很久了,这篇是Graywater系列文章最后一篇完结篇,把自己挖的坑给填了。
这篇文章是Graywater综合练习文章,包括了复杂视图的实现,基本增删改功能的实现,文末附有Demo地址,同样Demo也只是起一个抛砖引玉的作用,实际上还有很大的延展空间。
先上Demo效果图:
老规矩,还是先说说本文目录:
1. 复杂视图的实现
2. 数据的插入
3. 数据的删除
4. 数据的更新
5. 注意点
1. 复杂视图的实现
从GIF图中可以看到,该RecyclerView分为2大模块,娱乐新闻模块和体育新闻模块,每个模块对应一个数据源Primitive和一个管理器ItemBinder,数据源就对应了该模块所有数据内容,管理器对该模块所有视图进行管理。
比如娱乐新闻模块对应了一个EntertainPrimitive和EntertainItemBinder,包含了该模块的所有数据,同时还包含了娱乐新闻标题Binder和娱乐新闻内容的Binder(娱乐新闻内容的Binder使用List集合保存)。
接着往下看,在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的下标。看一下断点截图就明白了:
因为包含了标题TitleBinder,所以第一条新闻内容对应的binderIndex对应的下标是1,但新闻内容的数据集合与新闻标题的数据是相互独立,没有关系的,所以第一条新闻内容在数据集合中的位置是0,所以binderIndex需要减1。
补充:
- GraywaterPrimaryDemo Github地址
如果对你有帮助的话,点赞、评论都是对我的鼓励,也是支持我写下去的动力,谢谢!
RecyclerView的超强辅助Graywater——综合实操篇相关推荐
- RecyclerView的超强辅助Graywater——基础实操篇
关于Graywater的系列文章 RecyclerView的超强辅助Graywater--理论篇 RecyclerView的超强辅助Graywater--基础实操篇 RecyclerView的超强辅助 ...
- RecyclerView的超强辅助Graywater——理论篇
关于Graywater的系列文章 RecyclerView的超强辅助Graywater--理论篇 RecyclerView的超强辅助Graywater--基础实操篇 RecyclerView的超强辅助 ...
- RecyclerView的超强辅助Graywater——点击事件
关于Graywater的系列文章 RecyclerView的超强辅助Graywater--理论篇 RecyclerView的超强辅助Graywater--基础实操篇 RecyclerView的超强辅助 ...
- Linux实操篇笔记
Linux实操篇 远程登陆Linux 先检查一下sshd服务打开没有( " * " 表示打开): setup 选择系统设置,进入下面页面: Xshell 是一个强大的安全终端模拟软 ...
- 第五章-Linux实操篇
title: 第五章 Linux实操篇 categories: Linux tags: linux typora-root-url: - abbrlink: 93414991 date: 2019-0 ...
- Linux入门笔记-尚硅谷韩顺平-基础篇实操篇
文章目录 课程导论 基础篇 Linux入门 Linux介绍 Linux和Unix的关系 Linux和Windows比较 基础篇 Linux的目录结构 基本介绍 具体的目录结构 实操篇 vi和vim的使 ...
- Linux实操篇,开机重启和用户注销
Linux实操篇,开机重启和用户注销 1. shutdown shutdown -h now :立即关机 shutdown -h 1 :一分钟后关机 shutdown -r now :立即重启 hal ...
- frp(内网穿透)实操篇--映射远程端口(二)
frp(内网穿透)实操篇–远程电脑(二) 内网穿透的前提需要:一个拥有固定的ip地址的主机: 常规家用网络运营商都采用的是动态ip,ip随时在变化 我这里用到的是 腾讯云:大家有需要也可以购买. 新用 ...
- frp(内网穿透)实操篇--映射远程端口(一)
frp(内网穿透)实操篇–远程电脑(一) 内网穿透的前提需要:一个拥有固定的ip地址的主机: 常规家用网络运营商都采用的是动态ip,ip随时在变化 我这里用到的是 腾讯云:大家有需要也可以购买. 新用 ...
最新文章
- Time(sdutoj2272)_JAVA
- [转贴]电视和显示器的相关语言
- pycharm无法导入本地模块问题
- Office 365 On MacOS 系列——安装 O365 其他组件
- (Origin)设置图例位置
- 性能优化篇 - Performance(工具 api)
- android httpclient webview,android – 访问WebView中的http响应头?
- Python网络爬虫第一弹《Python网络爬虫相关基础概念》
- matlab在mac中好用吗,Matlab Mac版上手
- bootice添加黑苹果引导_联想小新13Pro黑苹果系统bigsur教程(OC引导)
- java计算机毕业设计南京新东方学校家校通系统源码+系统+数据库+lw文档+mybatis+运行部署
- python安装库的命令-免费足球现场直播直播
- JAVA微信会员卡接口踩坑
- Unity鼠标左键控制物体
- 百度ai智能写作工具-百度ai自动写文章
- I aced it!我做得很好
- 【JavaWeb】JSP技术详解
- CCI指标的计算公式
- php windows环境安装(图文版)
- equation buu
热门文章
- JavaScript实现屏幕录制
- 软件测试分类,本篇博文属于对软件测试领域的科普篇
- Windows驱动调试
- (附源码)springboot优课在线教学系统 毕业设计 081251
- 100天精通Python(数据分析篇)——第71天:Pandas文本数据处理方法之str/object类型转换、大小写转换、文本对齐、获取长度、出现次数、编码
- 我用js写了一个,除夕烟花秀和春节随机祝福语
- 虚拟机硬盘直通挽救黑群晖数据
- windows 10:安装PDFtk server后,查验时提示——‘pdftk‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
- 解决所有在Google drive上下载文件的问题
- Godaddy 10月2日 优惠券