我已经将我的targetSdkVersion
从28更新到30,我注意到getAdapterPosition()
已被弃用(我不确定这是什么时候发生的)。
在文档中,他们说:
不建议使用此方法。
当适配器嵌套其他适配器时,此方法会引起混淆。如果你在Adapter的上下文中调用它,你可能想调用getBindingAdapterPosition(),或者如果你想让RecyclerView看到它的位置,你应该调用getAbsoluteAdapterPosition()。
文档还说明了以下内容:
请注意,如果您正在查询RecyclerView所看到的位置,则应该使用getAbsoluteAdapterPosition()(例如你想用它来保存滚动状态)。如果要查询位置以访问RecyclerView.Adapter内容,则应使用getBindingAdapterPosition()。
我的理解是:
getBindingAdapterPosition
应该在你想获取适配器位置时使用(如果它仍然存在于适配器中)。如果它不再存在于适配器中,它将返回-1
(NO_POSITION)。- 应该使用
getAbsoluteAdapterPosition
来获取RecyclerView
看到的位置。例如,如果一个项目已被删除,但尚未从ViewHolder
中删除。
换句话说,如果我的Adapter
中有4
项,我删除位置0
并在从ViewHolder
中删除项之前查询getAbsoluteAdapterPosition
和getBindingAdapterPosition
,然后getAbsoluteAdapterPosition
将返回0
(因为视图仍然在ViewHolder
中),getBindingAdapterPosition
返回-1
(因为它不再存在于适配器中)。
我通过记录以下内容测试了差异:
Log.e("difference", "getAdapterPosition = "+myHolder.getAdapterPosition()+" getBindingAdapterPosition = "+myHolder.getBindingAdapterPosition()+" getAbsoluteAdapterPosition = "+myHolder.getAbsoluteAdapterPosition());
它们返回完全相同的值。我看不出有什么不同。
在调用notifyItemChanged
、notifyDataSetChanged
或notifyItemRangeChanged
之前或之后,我也没有看到任何区别。但是当我删除位置0
并调用notifyItemRemoved
时,它随后返回-1
(对于所有位置)。
我的问题
我理解的对吗?我们应该在什么时候使用哪个?还有,什么时候会有差别?
1条答案
按热度按时间yyyllmsg1#
recyclerview:1.2.0-alpha02
引入了MergeAdapter
,现已更名为ConcatAdapter
,并带有**recyclerview:1.2.0-alpha04
。此RecyclerView适配器可以合并 * 多个适配器线性组合。
类似于:
作为此更改的一部分,
getAdapterPosition()
方法已弃用,因为当适配器嵌套其他适配器时,该名称会引起混淆。现在应该使用getBindingAdapterPosition()
方法,返回在特定适配器(bindingAdapter
)中的位置。同时查看
RecyclerView.ViewHolder
的源代码:相反,
getAbsoluteAdapterPosition()
方法返回项目相对于整个RecyclerView
的Adapter位置。如果您使用的是ConcatAdapter
,则是ConcatAdapter
中的位置,而不是单个bindingAdapter中的位置。仅举两个适配器的例子:
更多细节请参见official blog post。