我有一个RecyclerView.Adapter
的{{1}}和一个hasStableIds(true);
的{{1}}
我将新项目插入适配器中的对象列表,然后调用LinearLayoutManager
。列表是相反的,并且从下到上加载,reverseLayout(true);
始终在底部。
问题是,调用NotifyItemInserted(0)
的所有ViewHolders都是“刷新” /“重新加载” /“重新创建”的-视图持有者有点复杂,不希望每次都重新创建它们。
当我调试解决方案时,new item
从位置0(正确)开始,然后根据屏幕上有多少项目上升到位置10或11,然后重新创建它们。
我在NotifyItemInserted
,OnBindViewHolder
和adapter
本身上尝试了许多不同的设置,但它们都不起作用。
我看到有一个有效载荷,可以在layoutmanager
中传递,但不能在recyclerview
中传递。也许有了有效载荷,我就可以检查该项目是否已经在屏幕上,并且不必再次创建它,我不知道该怎么办。
我正在使用Xamarin.Android,但这在这里应该不是问题。
答案 0 :(得分:1)
删除hasStableIds(true)
应该可以解决您的问题。
原因:
将hasStableIds
设置为true
时,Adapter
假定每个项目都有唯一的ID,并且它使用从getItemId(int position)
方法返回的值来设置数据动画为您改变。
这是一种轻松进行更改动画的简便方法(只要getItemId(int position)
确实为每个项目返回唯一的ID,否则您将崩溃)。
但是,在您的情况下,您希望自己为更改设置动画,并控制哪些项目将被重新渲染而哪些则不会。