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

简介: 以下内容为原创,欢迎转载,转载请注明来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6641794.html[Android]使用RecyclerView替代ListView(四:SeizeRecyclerView)在RecyclerView的...


以下内容为原创,欢迎转载,转载请注明
来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6641794.html

[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(),评论的数据加载也是如此。

于是根据这个思想,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 详细的使用说明。

最后效果如下:

img_ce86603e661470c3df8c5ec415bcc1db.gifimg_e392ba9b628b498e6ce30abf956a47ab.gif

相关文章
|
Android开发 数据格式 XML
[Android]使用RecyclerView替代ListView(三)
以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4268097.html    这次来使用RecyclerView实现PinnedListView的效果,效果很常见: 开发的代码建立在上一篇([Android]使用RecyclerView替代ListView(二):http://www.cnblogs.com/tiantianbyconan/p/4242541.html)基础之上。
1154 0
|
缓存 Android开发 数据格式
[Android]使用RecyclerView替代ListView(二)
以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4242541.html   以前写过一篇“[Android]使用AdapterTypeRender对不同类型的item数据到UI的渲染(http://www.cnblogs.com/tiantianbyconan/p/3992843.html)”,用于在有很多不同类型不同布局的item的时候怎么去较好的进行view的绑定和数据的渲染,但是这个是针对ListView写的。
1054 0
|
Android开发 数据格式 XML
[Android]使用RecyclerView替代ListView(一)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4232560.html   RecyclerView是一个比ListView更灵活的一个控件,以后可以直接抛弃ListView了。
1007 0
|
1月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
237 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
1月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
203 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
1月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
516 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
483 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
1月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
121 0

热门文章

最新文章