在使用RecyclerView做聊天页面时下拉时,使用addAll(0, tempDatas)加载数据后页面会出现闪烁,一开始以为是动画问题,所以加了(itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false处理后,发现还是出现闪烁问题。
测试发现,如果直接在数据集尾部添加数据,并不会有闪烁问题,最终定位到getItemId这个方法,该方法我在基类默认的处理是返回position作为id。而当在数据头部添加数据时,导致所有数据的getItemId都发生改变了,所以调用notifyDataSetChanged会重新刷新。解决方法如下:
1、在Adapter设置给RecyclerView之前,调用setHasStableIds(true)
setHasStableIds(true)
2、保证getItemId是个唯一值,这里我使用的是数据的hashCode作为id返回
override fun getItemId(position: Int): Long {
return data[position].hashCode().toLong()
}
3、使用notifyItemRangeInserted更新数据
adapter.notifyItemRangeInserted(0, tempDatas.size)