天天看点

真实项目运用-RecyclerView封装 前言 项目结构 RecyclerView基础 ViewHolder 多Item布局实现 一种item布局的实现: 加载更多以及header 和footer的添加 添加section分区操作: 参考链接

刚好解决了昨天在鸿洋博客下看到的这个小问题。哈哈。希望对大家有帮助。

真实项目运用-RecyclerView封装 前言 项目结构 RecyclerView基础 ViewHolder 多Item布局实现 一种item布局的实现: 加载更多以及header 和footer的添加 添加section分区操作: 参考链接

首先看看我的项目结构,项目分为common 和module模块,这里对之前整个项目的框架进行了改造,没有了之前的library,取而代之的是将所有公用组件放在了common包中,这是每个项目都可以copy使用的部分。在module包中就是具体每个项目的每个模块。比如这个示例项目中,包含

真实项目运用-RecyclerView封装 前言 项目结构 RecyclerView基础 ViewHolder 多Item布局实现 一种item布局的实现: 加载更多以及header 和footer的添加 添加section分区操作: 参考链接

整体结构

recyclerview组件作为每个项目中都可以使用的组件,这里放在common-widgets-recyclerview包下。

真实项目运用-RecyclerView封装 前言 项目结构 RecyclerView基础 ViewHolder 多Item布局实现 一种item布局的实现: 加载更多以及header 和footer的添加 添加section分区操作: 参考链接

这里可以看到的recyclerview组件这里添加了adapter,base,divider,section,utils,wrapper包。下面来进行深入的讲解以及怎样在项目开发中进行使用吧。

真实项目运用-RecyclerView封装 前言 项目结构 RecyclerView基础 ViewHolder 多Item布局实现 一种item布局的实现: 加载更多以及header 和footer的添加 添加section分区操作: 参考链接

recyclerview公用组件

recyclerview is a more advanced and flexible version of listview. this widget is a container for large sets of views that can be recycled and scrolled very efficiently. use the recyclerview widget when you have lists with elements that change dynamically. recyclerview 是android l版本中新添加的一个用来取代listview的sdk,它的灵活性与可替代性比listview更好。recyclerview与listview原理是类似的:都是仅仅维护少量的view并且可以展示大量的数据集。在recyclerview标准化了viewholder类似于listview中convertview用来做视图缓存。

viewholder是google在优化listview性能的技巧上就提到的,虽然google并没有强制使用,但事实上它已经成为listview的编写规范。在recyclerview上,viewholder的使用成为了一种强制手段了。接下来对封装的viewholder进行分析:

首先来看看viewholder的用法,这是一个简单的获取string数组并展现到textview上。通过数组的大小来创建item的数量。

当然这里只是简单的一个textview,但是当数据多起来之后,很多textview,imageview,以及代码段

都可以进行稍微修改。现在viewholder修改如下:

这里需要关注的是getview方法,直接返回当前view的类型。

所以我们可以在使用viewholder的时候

就完成了textview的settext操作。而没有进行类型转换。当然这里省去了findviewbyid的步骤的同时,使用<code>private sparsearray&lt;view&gt; mviews</code> 进行所有view的保存,也就是在牺牲一定内存性能的情况下,确保了代码的整洁性。还需要关注上面的

这也是我们使用recyclerview和listview中过程中经常遇到的问题。看看网易新闻的列表样式,顶部大图,标题+三张图片,标题+左侧图片,视频样式,广告样式....... 这种情况我们怎么便捷快速处理呢?

真实项目运用-RecyclerView封装 前言 项目结构 RecyclerView基础 ViewHolder 多Item布局实现 一种item布局的实现: 加载更多以及header 和footer的添加 添加section分区操作: 参考链接

看看通常处理itemview的type类型不同的方法:

并且在 oncreateviewholder()针对不同的viewtype进行不同的viewholder创建。

同时,这样使用不同的type 来处理不同的位置的数据,也能解决listview中经常遇到的一个问题,那就是header和footer 的view的添加。我们只需要针对首尾位置进行itemviewtype 的处理并且返回header和footer的view就行了。

这里也对这种情况进行了处理的封装:

看看实际项目中的效果,一个adapter就完成了所有的不同的item类型操作。

整个类继承自<code>multiitemtypeadapter&lt;t&gt;</code>:

来看看multiitemtypeadapter&lt;t&gt;

<code>multiitemtypeadapter&lt;t&gt;</code>,这里主要完成了list形式添加数据,数据类型使用泛型操作,只需要在构造函数中,或者public方法 <code>adddataall</code>就可以添加列表类型数据。利用<code>itemviewdelegatemanager</code>完成不同类型type的管理.而添加不同的type是对接口<code>itemviewdelegate</code>的实现。<code>itemviewdelegatemanager</code>起到了一个中间管理者和代理者的作用。具体看下面的代码:

这里也就解决了多种itemviewtype的问题。实现了方便的添加不同的类型的item数据。泛型数据降低了代码的耦合度。

这里提供一种item布局,就只需要对multiitemtypeadapter&lt;t&gt;进行限定一种layout类型。并且isforviewtype方法返回true,代表着始终返回当前的layout。

那么对于只有一种类型的列表数据

具体的新闻类型:

这里也就实现了单一的列表形式,比如网易新闻的专题样式:

真实项目运用-RecyclerView封装 前言 项目结构 RecyclerView基础 ViewHolder 多Item布局实现 一种item布局的实现: 加载更多以及header 和footer的添加 添加section分区操作: 参考链接

这里直接参加wrapper包中几个类,

真实项目运用-RecyclerView封装 前言 项目结构 RecyclerView基础 ViewHolder 多Item布局实现 一种item布局的实现: 加载更多以及header 和footer的添加 添加section分区操作: 参考链接

这里的header和footer没有个数的限制。

现在需求又来了 。需要对recyclerview中的item进行分区操作,就比如说微信以b开头的姓名都放在b这个分区下,以c开头的名字,都在c这个分区下。比如说京东的这个界面

列表数据里面添加了分区。那么怎么操作呢?

真实项目运用-RecyclerView封装 前言 项目结构 RecyclerView基础 ViewHolder 多Item布局实现 一种item布局的实现: 加载更多以及header 和footer的添加 添加section分区操作: 参考链接

也就是代码中的recyclerview-section包中的部分。

真实项目运用-RecyclerView封装 前言 项目结构 RecyclerView基础 ViewHolder 多Item布局实现 一种item布局的实现: 加载更多以及header 和footer的添加 添加section分区操作: 参考链接

1) 创建自定义 section 类集成自 statelesssection

2) 添加section到adapter,注意这里是sectionrvadapter

看看界面效果

真实项目运用-RecyclerView封装 前言 项目结构 RecyclerView基础 ViewHolder 多Item布局实现 一种item布局的实现: 加载更多以及header 和footer的添加 添加section分区操作: 参考链接

整个代码由于是对<code>recyclerview.adapter</code>封装。所以需要关注的方法自然是<code>getitemviewtype</code>,<code>onbindviewholder</code>,<code>createviewholder</code>和<code>getitemcount</code>四个方法,下面以这四个方法为切入点进行分析:

初始化需要关注的是这里使用hashmap对section进行存储。也就实现了后面的根据section的添加顺序依次展示section到recyclerview中。

真实项目运用-RecyclerView封装 前言 项目结构 RecyclerView基础 ViewHolder 多Item布局实现 一种item布局的实现: 加载更多以及header 和footer的添加 添加section分区操作: 参考链接

oncreateviewholder完成的是viewholder的创建,每一个section分为头部header,底部footer。以及中间部分,中间布局可以有loading/loaded/failed三种状态分别对应加载,加载成功,失败界面。注意这里的状态都分别对应于每个section里面,而不是整个recyclerview.

也就是说一个recyclerview可以由多个section组成,一个section最多只能有一个header和footer,section由多个recyclerview的item条目组成。每个section中间可以有三种状态。loading/loaded/failed三种状态分别对应加载,加载成功,失败界面。
真实项目运用-RecyclerView封装 前言 项目结构 RecyclerView基础 ViewHolder 多Item布局实现 一种item布局的实现: 加载更多以及header 和footer的添加 添加section分区操作: 参考链接

和前面<code>multiitemtypeadapter&lt;t&gt;</code>的实现一样,我们需要根据不同viewtype创建不同的viewholder.但是需要注意的是一个section是由一组item组成的,所以一个section需要多次的调用oncreateviewholder进行创建不同的类型的样式。

接下来关注<code>onbindviewholder</code>方法,通过

<code>int sectiontotal = section.getsectionitemstotal();</code>获取到了section的item的数量,并在下方针对每个section的头部header,底部footer,以及中间部分进行操作。并且调用<code>onbindheaderviewholder(holder)</code>,

<code>onbindfooterviewholder(holder)</code>

以及<code>onbindcontentviewholder(holder, getsectionposition(position))</code>方法,这就是当我们实现section代码的时候需要实现的方法。<code>section.getsectionitemstotal()</code>也是我们实现section的时候提供的section的item的个数。

接下来关注getitemcount,代表整个recyclerview的item的个数。当然是所有section的item的总和,所以代码如下。

真实项目运用-RecyclerView封装 前言 项目结构 RecyclerView基础 ViewHolder 多Item布局实现 一种item布局的实现: 加载更多以及header 和footer的添加 添加section分区操作: 参考链接

最后需要关注的是方法<code>getitemviewtype</code>,这里也就完成了每个section的五种类型的int返回操作。

最后针对最近项目中遇到的这个问题,针对不同的布局,比如说下面的这个既有grid,又有linear的形式。由于之前的问题全部是针对一个recyclerview的,而一个recyclerview在调用<code>recyclerview.setlayoutmanager()</code>方法的时候,就只能有一个布局方式。好吧,当初我就是为了解决这个问题,后来才发现需要用三个recyclerview来解决。

真实项目运用-RecyclerView封装 前言 项目结构 RecyclerView基础 ViewHolder 多Item布局实现 一种item布局的实现: 加载更多以及header 和footer的添加 添加section分区操作: 参考链接
注:这里不能提供实际项目代码,只能提供代码片段作为参考。目前暂未提供示例代码到github的项目中,只提供了recyclerview公用组件。

<a target="_blank" href="https://github.com/hongyangandroid/baseadapter">baseadapter github</a>

<a target="_blank" href="http://blog.csdn.net/lmj623565791/article/details/51118836">为recyclerview打造通用adapter 让recyclerview更加好用</a>

<a target="_blank" href="http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0307/4032.html">recyclerview源码分析</a>

<a target="_blank" href="http://www.jianshu.com/p/16712681731e">recyclerview技术栈</a>

真实项目运用-RecyclerView封装 前言 项目结构 RecyclerView基础 ViewHolder 多Item布局实现 一种item布局的实现: 加载更多以及header 和footer的添加 添加section分区操作: 参考链接
真实项目运用-RecyclerView封装 前言 项目结构 RecyclerView基础 ViewHolder 多Item布局实现 一种item布局的实现: 加载更多以及header 和footer的添加 添加section分区操作: 参考链接

继续阅读