https://juejin.im/post/5a7569676fb9a063435eaf4c
RecyclerView 缓存机制:
https://juejin.im/post/5b79a0b851882542b13d204b
RecyclerView 局部刷新:
https://juejin.im/post/5caee76a6fb9a06891739c9b#heading-2
之前这种RecyclerView的复用缓存我都是放在list集合中管理,每次改变一个item的状态时候都会将集合重新修改然后notifyDataSetChanged一下,但是这种做法太暴力了。将所有的item都刷新了一遍,如果你的item全是静态的都还好说,要是有个动画或者别的东西,你懂得全是闪烁。
所以就在查找资料关于recyclerview局部刷新的。一般就两种做法:第一种就是通过recyclerview的findViewHolderForAdapterPosition方法找到那个item所在的viewholder直接拿到viewholder进行操作,不过这种方法存在弊端,就是只能获取当前屏幕所显示的viewholder,如果不在当前屏幕那就会获取的是一个null。所以在使用的时候应该通过manager.findFirstVisibleItemPosition()和manager.findLastVisibleItemPosition()判断要改变的item的position是否在这区间内。第二种方式通过layoutManager.findViewByPosition()获取view 注意的地方也是和第一种一样。
那还有一种方法可以实现局部刷新,那就是 corverAdapter.notifyItemChanged(logPosition,"test").第二个参数任意类型的参数,还需要在适配器中重写onBindViewHolder(VH holder, int position, List<Object> payloads)方法,第三个参数大小只有1.它的值就是我们之前传入的“test”。我们可以在这里实现我们想要做的局部刷新操作。如果payloads为空集的话我们就调用 onBindViewHolder(holder,position)方法,如果payloads不为空那我们就可以从集合中拿到数据然后自己去改变我们想要的一些布局。
if (payloads!!.isEmpty()){
onBindViewHolder(holder!!,position)
}else{
var payLoad = payloads.get(0)
log("设置的值=="+payLoad)
val isPlaying = listData.get(position)
var viewholder = holder as CorverCheckViewHolder
var corverItemView = viewholder.coverItemView
corverItemView.setPlaying(isPlaying)
}