参考:https://stackoverflow.com/questions/44081579/sethasstableidstrue-in-recyclerview
问题场景
在一个RecyclerView中,itemd的数据以及数量均有可能发生改变,原本仅仅在Observer中使用MyAdapter.notifyDataSetChanged()
,但是出现刷新后item位置随机偏移的情况(尤其当前显示的item不为第一项,且刷新前后item数量不一样时),体验感极差,不够丝滑。
又尝试在MyAdapter.notifyDataSetChanged()
前面添加MyRecyclerView.adapter=null
和MyRecyclerView.adapter=MyAdapter
两行,虽然不会出现item偏移而且刷新后会显示第一个item(recyclerview整个被redraw了),但是中途会有短暂的空白,也不够丝滑。
问题解决
Observer按初版不变,在MyAdapter类下重载函数
@Override
override fun getItemId(position:Int):Long{
return position.toLong()
}
为MyRecyclerView设置adapter时加上adapter.setHasStableIds(true)
,比如
val adapter = MyAdapter(context)
adapter.setHasStableIds(true)
MyRecyclerView.adapter = adapter
这样刷新页面后既不会出现item偏移也不会出现闪白,数据直接丝滑地更新到当前item,并且如果刷新前在第5个item(假设共5个),刷新后的数据会是第4个item(假设刷新后共4个)。