问题 假如有100个item,一屏同时最多展示12个,RecyclerView 滑动时,会创建多少个viewholder?
这是第一次进去看到页面创建了一共14个ViewHolder
我们滑动到最底然后又滑动回来根据日志打印可以看到一共创建了19个ViewHolder。
ViewHolder是RecyclerView复用的单位,发现是创建ViewHolder的个数和item的高度还有手机屏幕高有关,具体要研究源码分析。
2 RecyclerView实现Item的局部刷新
有时候我们要刷新列表,这时候使用notifyDataSetChanged方法,这种直接太暴力了,也性能太低下了。将很多不必要的item都刷新了一遍。如果item里面有动画或者加载图片的类似,必定引起闪烁。
现在一般两种做法,第一种就是通过recyclerview的findViewHolderForAdapterPosition找到那个item所在的viewholder直接拿到viewholder进行操作
比如我要更新第55个item的textview的文案,找到position=55的viewholder,再通过viewholder拿到View,最后再把文案设置上去viewHolder?.textView?.text ="我是更新的",后面还要更新我们数据源的数据,否则当你再次滑动时候调用onBindViewHolder又会恢复成原来的数据。不过这个方法存在弊端,就是只能获取当前屏幕所显示的ViewHolder。如果不在当前屏幕那么就会获取的是一个null。可以通过
manager.findFirstVisibleItemPosition和manager.findLastVisibleItemPosition()判断要改变的item的position是否在这区间内。
另外还有一种方法可以实现局部刷新,这个第二个参数是任意类型的参数,如果payloads为空集的话,我们就调用onBindViewHolder(holder,position)方法,如果payloads不为空那我们就可以从集合中拿到数据然后去改变我们想要的一些布局。
网友评论