Android 进阶学习(三十) RecyclerView 缓存
![](https://img.haomeiwen.com/i11861448/99d69a11da88c5cd.png)
相信大家基本都遇到过类似京东的评价列表的这种需求,具体的实现逻辑是RecyclerView 嵌套RecyclerView 来实现的,那么我们如何来提升他的性能呢,又如何使用最少的代码来达到我们想要的效果呢,下面我们来分析一下,
1.想要实现上面的效果,内部的RecyclerView 的LayoutManager 必须是GridLayoutManager ,我们根据数据的个数来设置spancount,从而来达到
2.外层的RecyclerView 会根据自身来缓存view 的信息,从而来提升渲染速度,难么嵌套在内部的RecyclerView 如何来缓存呢, 答案就是使用 RecyclerView.RecycledViewPool ,所有的内部RecyclerView 来共享一个RecyclerView 的第四极缓存 ,如果对换粗机制不了解的可以看一下这篇文章(RecyclerView 学习 (二) 关于RecyclerView 缓存机制 https://www.jianshu.com/p/4c6affc0c4cf ),这样就保证在内部RecyclerView 的item被回收时,会将所有item 放入到这个RecyclerView.RecycledViewPool,查看RecyclerView.RecycledViewPool 的源码我们发现 RecyclerView.RecycledViewPool是有上限的,那么我么如何来设置他的上限呢,其实可以参照 RecyclerView 自身的二级缓存,也就是2个item,这里可以看成内部RecyclerView 的2倍的最大个数 也就是6
3.想要实现2中思想在给内部RecyclerView设置属性时,需要编写大量的代码,我们如何来减少代码的书写呢
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view_top_desc"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:focusable="false"
android:layout_marginBottom="12dp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@id/pic_item_designer_header"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="3"
tools:listitem="@layout/item_designer_desc_str"
android:layout_marginRight="8dp"
tools:itemCount="3"/>
注意,我在编写内部RecyclerView 时,指定了他的 layoutManager 为GridLayoutManager,那么在 外部adapter的时候就可以简写为
helper?.getView<RecyclerView>(R.id.recycler_view_top_desc)?.let {
it.setRecycledViewPool(pools)
var layoutManager= it.layoutManager as GridLayoutManager
layoutManager.spanCount=item?.designerTags?.size?:1
if(it.adapter==null){
it.adapter=DesignerStarDescAdapter(null)
}
(it.adapter as DesignerStarDescAdapter)?.apply {
setNewData(item?.designerTags)
setOnItemClickListener { adapter, view, position ->
this@DesignerStartListAdapter.onItemClickListener.onItemClick(this@DesignerStartListAdapter,helper.itemView,helper?.adapterPosition)
}
}
}
这样看起来是不是非常简单明了,而且还做到了layoutManager 的复用,不用增加额外的判断