博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Android]使用RecyclerView替代ListView(四:SeizeRecyclerView)
阅读量:5927 次
发布时间:2019-06-19

本文共 2857 字,大约阅读时间需要 9 分钟。

以下内容为原创,欢迎转载,转载请注明
来自天天博客:

[Android]使用RecyclerView替代ListView(四:SeizeRecyclerView)

在RecyclerView的开发过程中,可能会遇到一些窘境,比如,下图是今日头条的视频详情页面:

img_991261d4f2b195d28d6518683a48bf30.pngimg_ff6b5d7fd2b23cc7086a6f81d5957433.png

除去播放器外,其它组件应该是一个RecyclerView,但是这个RecyclerView中的item有两种类型:

  • 一种是上部的推荐视频

  • 一种是下面的评论

问题在于两类数据的最下面都有一个组件用于进行更多数据的加载,加载完毕后插入对应的position。

这里实现的方式应该怎么做呢?方法有很多,比如:

  • 所有数据放在一个List中,保存加载更多的index,点击加载更多的index的时候触发请求返回后把推荐更多数据插入对应的index中并更新index,评论也是一样。。

  • 推荐视频和评论保存在两个不同的List中,在Adapter中维护两份数据,重写getItemCount()等方法。

  • ...

但是这些方法在以后业务的扩展和灵活性等方面都不值得提倡。因为就算是以后的业务只是想把推荐视频和评论两大块互换位置(虽然这个业务场景可能性不大)都是一个不小的工作量。

原因在于,默认情况下一个RecyclerView只会有一个Adapter来进行数据的适配,这样的话,如果数据分成了几个块(推荐视频和评论),单个Adapter的控制能力就很有限了。

设想一下,如果一个RecyclerView可以有很多个Adapter来进行数据的适配的话,那问题是不是迎刃而解了?

RecyclerView中有RecommendAdapterCommentAdapterRecommendAdapter中维护一个List<Recommend>数据集,CommentAdapter中维护了一个List<Comment>数据集,每个Adapter中可以设置HeaderFooter,把加载更多的组件作为一个Footer加在RecommendAdapterCommentAdapter中,然后响应点击事件,请求到数据之后recommendAdapter.addList(List<Recommend>)加入到推荐视频的数据集中,然后recommendAdapter.notifyDataSetChanged(),评论的数据加载也是如此。

于是根据这个思想, 编写完成,下面以电影详情为例,界面与上面的视频详情一样,整个RecyclreView被分为两个部分:演员区域(Actor)评论区域(Comment)

使用方式如下:

引入 库:,后续会上传到Maven中心库

feedRv = (RecyclerView) findViewById(R.id.activity_main_rv);// RecyclerView真正的Adapteradapter = new FeedAdapter();// 为真正的Adapter增加Header和Footeradapter.setHeader(headerView = inflaterHeaderOrFooterAndBindClick(R.layout.header_film));adapter.setFooter(footerView = inflaterHeaderOrFooterAndBindClick(R.layout.footer_film));// 为真正的Adapter绑定各种seizeAdapter,这里的顺序决定了UI上显示的顺序adapter.setSeizeAdapters(        filmActorSeizeAdapter = new FilmActorSeizeAdapter(),        filmCommentSeizeAdapter = new FilmCommentSeizeAdapter());// 设置演员seize adapter的 header 和 footerfilmActorSeizeAdapter.setHeader(actorHeaderView = inflaterHeaderOrFooterAndBindClick(R.layout.header_film_actor));filmActorSeizeAdapter.setFooter(actorFooterView = inflaterHeaderOrFooterAndBindClick(R.layout.footer_film_actor));// 设置评论seize adapter的 header 和 footerfilmCommentSeizeAdapter.setHeader(commentHeaderView = inflaterHeaderOrFooterAndBindClick(R.layout.header_film_comment));filmCommentSeizeAdapter.setFooter(commentFooterView = inflaterHeaderOrFooterAndBindClick(R.layout.footer_film_comment));LinearLayoutManager layoutManager = new LinearLayoutManager(this);layoutManager.setOrientation(LinearLayoutManager.VERTICAL);feedRv.setLayoutManager(layoutManager);// 为RecyclerView设置真正的adapterfeedRv.setAdapter(adapter);

以上是RecylerView的初始化,并为Adapter添加两个SeizeAdapterFilmActorSeizeAdapterFilmCommentSeizeAdapter)。

请求完数据之后直接使用SeizeAdapter进行数据的填充和notifyDataSetChanged

public void onRequestActors(List
list) { filmActorSeizeAdapter.addList(list); filmActorSeizeAdapter.notifyDataSetChanged();}public void onRequestComment(List
list) { filmCommentSeizeAdapter.addList(list); filmCommentSeizeAdapter.notifyDataSetChanged();}

后续会增加 详细的使用说明。

最后效果如下:

img_ce86603e661470c3df8c5ec415bcc1db.gifimg_e392ba9b628b498e6ce30abf956a47ab.gif

你可能感兴趣的文章
sql server中根据地图经纬度算距离
查看>>
Java中volatile关键字解析
查看>>
Android API Guides---OpenGL ES
查看>>
iOS 使用腾讯地图显示用户位置注意事项
查看>>
LeetCode -- 删除链表中值为k的元素
查看>>
ES6生成器函数generator
查看>>
CVPR 2017
查看>>
创建Python程序
查看>>
JavaMelody 项目性能监控和调优工具
查看>>
编程乐趣:身份证号码验证的方法
查看>>
windows 下运行angualr/material2 项目
查看>>
《大话设计模式》--代理模式
查看>>
判断数组中是否存在重复元素
查看>>
流量相关说明
查看>>
uCOS-ii笔记
查看>>
python学习:字典排序
查看>>
easyUI的汇总列,在前端生成
查看>>
Python 装饰器
查看>>
@NotNull和@NotEmpty和@NotBlank区别
查看>>
WSDL协议简单介绍
查看>>