BRVAH(让RecyclerView变得更高效) (2)

本文来自网易云社区

作者:吴思博


1.2 宫格和列表的混排样式

关于 Grid 和List 的混排样式,Grid 样式是一行有多个,而 List样式是一行只有一个。 我们可以把 List 样式看成是Grid 样式,它就相当于把一个 Grid 的 item 拉长了的样子。

f1ca5df9-cfca-4ee6-98fd-d2b35a30bb59

列表与网格混排的布局效果,我们可以创建 adapter 继承 BaseMultiItemQuickAdapter添加对应 item 类型的布局文件,也可以在 Activity中创建GridLayoutManager对象,设置spanSize属性,通过 Adapter 的setSpanSizeLookup()方法设置每种item类型对应的spanSize。设置Recyclerview的addItemDecoration()方法设置添加分割线或设置 item 间距。

 

在创建GridLayoutManager对象时, spanSize的参数需要设置,它的作用就是使原来一个item占满一行变为可以最多三个 item 占满一行。

而设置setSpanSizeLookup()方法返回的是对应每种item类型返回具体的横跨大小。比如代码中TYPE_GRID类型的item在设置的spanSize是 1,而 GridLayoutManager 设置的 spanSize 是 3,那么该类型的item 就会以 3 个 item 占满一行,相当于每个 item 占一行的 1/3。

 

代码片段:

0a71770d-8767-410d-9882-4c7561005b6d?imageView&thumbnail=980x0

在我们使用addItemDecoration()添加分割线的方法中对这种混排的列表设置item间距的时候,在 getItemOffsets()方法里,通过GridLayoutManager.LayoutParams获取spanSize 来确定 item 类型设置对应间距, 其中spanIndex表示当前行item对应的下标位置,从左到右依次从 0 开始。

 

1.3 Recyclerview嵌套 Recyclerview 的复杂布局

我们“文学漫画”产品中,那些地方用到这种布局?例如蜗牛的领读ReadTrendFragment、 Lofter发现音乐Fragment、 云阅读书店BookStoreFragment。

 

f786eb51-b0ce-4eb5-9331-19b4d7259c01cbb51be0-c4db-41a9-bb08-95154437ea25

    

蜗牛的领读ReadTrendFragment                                              Lofter发现的音乐Fragment

 

这种界面布局样式,最外面一个RecyclerView,它里面嵌套一个 RecyclerView。继承BaseMultiItemQuickAdapter 在重写的 convert() 方法中实例化子 Recyclerview。

569aaa8b-7687-491c-97a5-958d9ca4425a

需要注意的是Recyclerview 嵌套 Recyclerview 会出现子 Recyclerview 抢焦点的问题, 导致界面顶部部分控件被挤出, 只需在最外面的Recyclerview 的包裹容器中设置属性 

Android:descendantFocusability="blocksDescendants" 即可。

 

2. 实现了点击监听事件

  85b72671-e853-4214-abd9-5238ab382177

BRVAH为我们提供好了全面的 item 和 item 子 View 的监听事件,我们只需在继承它提供的 Adapter 的基础上,通过adapter 来调用对应的监听。 设置监听子 View 前,我们需要在 adapter 中对应的 item 的子 View 注册对应的监听事件。

 

2.1对于 item 的监听事件处理

   直接在 Activity 中添加 item 点击事件,和listview一样。

c38382d0-0995-4c8f-8f29-6563db5a0f4c

item 长按监听事件

6166e953-9d54-42e4-8f7a-fe1f6c37e0c7


2.2对 item 中子 View 的监听事件处理

首先需要在adapter 中,注册子 View 的监听事件。

6267b929-c457-448d-8754-150fcfabdddf?imageView&thumbnail=980x0

e5358e88-cc75-485c-9a93-e67a5c00e5f1?imageView&thumbnail=980x0

2.3 也可以通过viewHolder.getView(viewId)获取该控件,再设置监听。

500a11de-0907-4b83-875c-b381ebf9d236

 

网易云免费体验馆,0成本体验20+款云产品! 

更多网易研发、产品、运营经验分享请访问网易云社区

相关文章:
【推荐】 Android优化之内存优化倒计时篇
【推荐】 [5.19 线下活动]Docker Meetup杭州站—拥抱Kubernetes,容器深度实践
【推荐】 Kubernetes性能测试实践