【发布时间】:2020-07-24 07:06:20
【问题描述】:
我已将我的 targetSdkVersion 从 28 更新到 30,我注意到 getAdapterPosition() 已被弃用(我不确定这是什么时候发生的)。
在documentation 中,他们说:
此方法已弃用。
当适配器嵌套其他适配器时,此方法会令人困惑。如果你在适配器的上下文中调用它,你可能想调用getBindingAdapterPosition(),或者如果你想要 RecyclerView 看到的位置,你应该调用getAbsoluteAdapterPosition()。
文档还说:
注意,如果你查询 RecyclerView 看到的位置,你应该使用getAbsoluteAdapterPosition()(例如你想用它来保存滚动状态)。如果你是查询位置来访问 RecyclerView.Adapter 的内容,你应该使用getBindingAdapterPosition()。
我的理解是:
-
getBindingAdapterPosition应该在您想要获取适配器位置时使用(如果它仍然存在于适配器中)。如果适配器中不再存在,则返回-1(NO_POSITION)。 -
getAbsoluteAdapterPosition应该用于获取RecyclerView看到的位置。例如,如果某个项目已被删除,但尚未从ViewHolder中删除。
换句话说,如果我的Adapter 中有4 项目,我删除位置0 并在项目从ViewHolder 中删除之前查询getAbsoluteAdapterPosition 和getBindingAdapterPosition,然后@987654340 @ 将返回0(因为视图仍在ViewHolder 中)和getBindingAdapterPosition 返回-1(因为它不再存在于适配器中)。
我通过记录以下内容测试了差异:
Log.e("difference", "getAdapterPosition = "+myHolder.getAdapterPosition()+" getBindingAdapterPosition = "+myHolder.getBindingAdapterPosition()+" getAbsoluteAdapterPosition = "+myHolder.getAbsoluteAdapterPosition());
它们返回完全相同的值。我看不出有什么区别。
我也发现在调用notifyItemChanged、notifyDataSetChanged 或notifyItemRangeChanged 之前或之后没有区别。但是当我删除位置0 并调用notifyItemRemoved 时,它会返回-1(对于所有这些)。
我的问题
我是否正确理解了这一点,我们应该什么时候使用哪个?还有,什么时候会有区别?
【问题讨论】:
-
如果使用
1.2.0中引入的新的ConcatAdapter会有所不同。在这种情况下,getBindingAdapterPosition()返回特定适配器中的位置,而不是整个ConcatAdapter。相反,getAbsoluteAdapterPosition()返回ConcatAdapter中的位置。 -
@GabrieleMariotti 嗯,这很有道理。那么这是否意味着,如果我只有一个适配器,那么我可以使用
getBindingAdapterPosition()或getAbsoluteAdapterPosition(),还是会有区别? -
另外,如果您检查源代码,
getAdapterPosition()现在会返回getBindingAdapterPosition();。 -
@GabrieleMariotti 如果您有时间,请为我提供除此之外的答案。我查看了源代码,正如您所提到的,
getAdapterPosition();被替换为getBindingAdapterPosition();。我认为可以肯定地说,当我们使用单个适配器时,我们应该使用getBindingAdapterPosition();。 -
我个人认为这种弃用是不必要的。在 98% 的情况下,
ConcatAdapter甚至不会被使用,但ViewHolder最常用的方法之一已被重命名以说明其存在。
标签: android android-recyclerview android-adapter