RecyclerView NotifyItemInserted

时间:2018-07-03 09:28:05

标签: android android-recyclerview recycler-adapter

我有一个RecyclerView.Adapter的{​​{1}}和一个hasStableIds(true);的{​​{1}}

我将新项目插入适配器中的对象列表,然后调用LinearLayoutManager。列表是相反的,并且从下到上加载,reverseLayout(true);始终在底部。

问题是,调用NotifyItemInserted(0)的所有ViewHolders都是“刷新” /“重新加载” /“重新创建”的-视图持有者有点复杂,不希望每次都重新创建它们。

当我调试解决方案时,new item从位置0(正确)开始,然后根据屏幕上有多少项目上升到位置10或11,然后重新创建它们。

我在NotifyItemInsertedOnBindViewHolderadapter本身上尝试了许多不同的设置,但它们都不起作用。

我看到有一个有效载荷,可以在layoutmanager中传递,但不能在recyclerview中传递。也许有了有效载荷,我就可以检查该项目是否已经在屏幕上,并且不必再次创建它,我不知道该怎么办。

我正在使用Xamarin.Android,但这在这里应该不是问题。

1 个答案:

答案 0 :(得分:1)

删除hasStableIds(true)应该可以解决您的问题。

原因:

hasStableIds设置为true时,Adapter假定每个项目都有唯一的ID,并且它使用从getItemId(int position)方法返回的值来设置数据动画为您改变。

这是一种轻松进行更改动画的简便方法(只要getItemId(int position)确实为每个项目返回唯一的ID,否则您将崩溃)。

但是,在您的情况下,您希望自己为更改设置动画,并控制哪些项目将被重新渲染而哪些则不会。