以下内容为原创,欢迎转载,转载请注明

来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6641794.html

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

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

除去播放器外,其它组件应该是一个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(),评论的数据加载也是如此。

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

使用方式如下:

引入 SeizeRecyclerView 库:https://github.com/wangjiegulu/SeizeRecyclerView,后续会上传到Maven中心库

feedRv = (RecyclerView) findViewById(R.id.activity_main_rv);

// RecyclerView真正的Adapter
adapter = new FeedAdapter();
// 为真正的Adapter增加Header和Footer
adapter.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 和 footer
filmActorSeizeAdapter.setHeader(actorHeaderView = inflaterHeaderOrFooterAndBindClick(R.layout.header_film_actor));
filmActorSeizeAdapter.setFooter(actorFooterView = inflaterHeaderOrFooterAndBindClick(R.layout.footer_film_actor)); // 设置评论seize adapter的 header 和 footer
filmCommentSeizeAdapter.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设置真正的adapter
feedRv.setAdapter(adapter);

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

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

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

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

最后效果如下:

[Android]使用RecyclerView替代ListView(四:SeizeRecyclerView)的更多相关文章

  1. [Android]使用RecyclerView替代ListView(三)

    以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4268097.html  这次来使用RecyclerView实现Pinn ...

  2. [Android]使用RecyclerView替代ListView(二)

    以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4242541.html 以前写过一篇“[Android]使用Adapte ...

  3. [Android]使用RecyclerView替代ListView(一)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4232560.html RecyclerView是一个比List ...

  4. Android笔记——RecyclerView替代ListView

    ListView是常用列表控件,但设置Adapter时自定义代码较为复杂,因此Android3.0后,增加RecyclerView替代ListView RecyclerView没有提供OnItemCl ...

  5. Android最新组件RecyclerView,替代ListView

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/40379159 万众瞩目的android最新5.0版本号不久前已经正式公布了,对于我 ...

  6. Android群英传笔记——第四章:ListView使用技巧

    Android群英传笔记--第四章:ListView使用技巧 最近也是比较迷茫,但是有一点点还是要坚持的,就是学习了,最近离职了,今天也是继续温习第四章ListView,也拖了其实也挺久的了,list ...

  7. Android RecyclerView与ListView比较

    RecyclerView 概述 RecyclerView 集成自 ViewGroup .RecyclerView是Android-support-V7版本中新增的一个Widgets,官方对于它的介绍是 ...

  8. 浅谈RecyclerView(完美替代ListView,GridView)

    Android RecyclerView 是Android5.0推出来的,导入support-v7包即可使用. 个人体验来说,RecyclerView绝对是一款功能强大的控件. 首先总结下Recycl ...

  9. Android控件RecyclerView与ListView的异同

    在我的一篇介绍Android新控件RecyclerView的博客(Android L新控件RecyclerView简介)中,一个读者留言说RecyclerView跟ListView之间好像没有什么不同 ...

随机推荐

  1. android学习17——命令行建gradle工程

    使用命令行建gradle工程要涉及到几个工具的版本. 1.gradle的版本.这个用gradle -version查到. 2.SDK BuildTools的版本. 这个要先配好SDK的环境变量,然后在 ...

  2. Sicily 1151 魔板

    Constraints Time Limit: 1 secs, Memory Limit: 32 MB , Special Judge Description 魔板由8个大小相同方块组成,分别用涂上不 ...

  3. Protege5.0.0入门学习

    OWL本体的重要组成部分 Individuals:个体,代表一个领域里面的对象.可以理解成一个类的实例(instances of classes). Properties:属性,是两个个体之间的双重联 ...

  4. Angular.js之指令学习笔记

    <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...

  5. vpn服务搭建

    先安装pptpd服务,就是VPN连接的软件模块. 输入:yum install ppp iptables pptpd 安装完成之后 A:编辑pptpd.conf: 输入:vim /etc/pptpd. ...

  6. linux 下 zookeeper安装

    1.安装zookeeper-3.4.6cd /usr/soft#解压zookeeper 安装包tar -zvxf zookeeper-3.4.6#拷贝安装包到安装目录cp zookeeper-3.4. ...

  7. Hibernate一对多双向关联映射

    建立多对一的单向关联关系    Emp.java            private Integer empNo //员工编号            private String empName / ...

  8. Servlet+Tomcat日志输出

    刚接触Servlet的时候,为了学习方便总是想验证自己的想法,那么输出日志是最常见的手法了,就自己亲身经历总结了如下几种方法,我用的是Web容器是Tomcat. 使用Log4J 在<Servle ...

  9. adt的问题An internal error has occurred. After scene creation, #init() must be called

    这个问题困扰了我好久,我也尝试去百度.google无济于事啊,让我寝食难安,太难受了,我把它贴出来,希望后人不绕弯子... 解决办法: 即可,解决这一个问题,现在酣畅淋漓,挥洒自如的capy代码了

  10. c#调用aapt查看apk文件信息功能实现

    第一篇随笔就此开始. 1. 起源 思路源自于项目开发过程中.需要确认apk文件版本以验证其功能差异以便于定位问题,于是度娘,得到APK信息查看器(APK-info)这个工具,其版本号为0.2.它能显示 ...