android getAdapterPosition()已弃用

bkhjykvo  于 2023-05-12  发布在  Android
关注(0)|答案(1)|浏览(199)

我已经将我的targetSdkVersion从28更新到30,我注意到getAdapterPosition()已被弃用(我不确定这是什么时候发生的)。
在文档中,他们说:
不建议使用此方法。
当适配器嵌套其他适配器时,此方法会引起混淆。如果你在Adapter的上下文中调用它,你可能想调用getBindingAdapterPosition(),或者如果你想让RecyclerView看到它的位置,你应该调用getAbsoluteAdapterPosition()。
文档还说明了以下内容:
请注意,如果您正在查询RecyclerView所看到的位置,则应该使用getAbsoluteAdapterPosition()(例如你想用它来保存滚动状态)。如果要查询位置以访问RecyclerView.Adapter内容,则应使用getBindingAdapterPosition()。
我的理解是:

  • getBindingAdapterPosition应该在你想获取适配器位置时使用(如果它仍然存在于适配器中)。如果它不再存在于适配器中,它将返回-1(NO_POSITION)。
  • 应该使用getAbsoluteAdapterPosition来获取RecyclerView看到的位置。例如,如果一个项目已被删除,但尚未从ViewHolder中删除。

换句话说,如果我的Adapter中有4项,我删除位置0并在从ViewHolder中删除项之前查询getAbsoluteAdapterPositiongetBindingAdapterPosition,然后getAbsoluteAdapterPosition将返回0(因为视图仍然在ViewHolder中),getBindingAdapterPosition返回-1(因为它不再存在于适配器中)。
我通过记录以下内容测试了差异:

Log.e("difference", "getAdapterPosition = "+myHolder.getAdapterPosition()+" getBindingAdapterPosition = "+myHolder.getBindingAdapterPosition()+" getAbsoluteAdapterPosition = "+myHolder.getAbsoluteAdapterPosition());

它们返回完全相同的值。我看不出有什么不同。
在调用notifyItemChangednotifyDataSetChangednotifyItemRangeChanged之前或之后,我也没有看到任何区别。但是当我删除位置0并调用notifyItemRemoved时,它随后返回-1(对于所有位置)。

我的问题

我理解的对吗?我们应该在什么时候使用哪个?还有,什么时候会有差别?

yyyllmsg

yyyllmsg1#

recyclerview:1.2.0-alpha02引入了MergeAdapter,现已更名为ConcatAdapter,并带有**recyclerview:1.2.0-alpha04
此RecyclerView适配器可以合并 * 多个适配器
线性组合。
类似于:

FirstAdapter adapter1 = ...;
SecondAdapter adapter2 = ...;
ConcatAdapter merged = new ConcatAdapter(adapter1, adapter2);
recyclerView.setAdapter(mergedAdapter);

作为此更改的一部分,getAdapterPosition()方法已弃用,因为当适配器嵌套其他适配器时,该名称会引起混淆。现在应该使用getBindingAdapterPosition()方法,返回在特定适配器bindingAdapter)中的位置。
同时查看RecyclerView.ViewHolder的源代码:

@Deprecated
    public final int getAdapterPosition() {
        return getBindingAdapterPosition();
    }

相反,getAbsoluteAdapterPosition()方法返回项目相对于整个RecyclerView的Adapter位置。如果您使用的是ConcatAdapter,则是ConcatAdapter中的位置,而不是单个bindingAdapter中的位置。
仅举两个适配器的例子:

更多细节请参见official blog post

相关问题