getAdapterPosition() 已弃用

Cla*_*ssA 39 android android-adapter android-recyclerview

我已将我targetSdkVersion的 28更新到 30,我注意到它getAdapterPosition()已被弃用(我不确定何时发生这种情况)。

文档中,他们说:

此方法已弃用。
当适配器嵌套其他适配器时,此方法会造成混淆。如果您在 Adapter 的上下文中调用它,您可能想要调用getBindingAdapterPosition()或者如果您想要 RecyclerView 看到的位置,您应该调用getAbsoluteAdapterPosition()

该文档还说明了以下内容:

请注意,如果您正在查询 RecyclerView 看到的位置,则应使用getAbsoluteAdapterPosition()(例如,您想使用它来保存滚动状态)。如果您要查询访问 RecyclerView.Adapter 内容的位置,则应使用getBindingAdapterPosition()

我的理解是:

  • getBindingAdapterPosition当您想要获取适配器位置时应该使用它(如果它仍然存在于适配器中)。如果它不再存在于适配器中,它将返回-1( NO_POSITION )。
  • getAbsoluteAdapterPosition应该用于获取位置,如RecyclerView所见。例如,如果某个项目已被删除,但尚未从ViewHolder.

换句话说,如果我的 中有4项目Adapter,我删除位置0和查询,getAbsoluteAdapterPosition并且getBindingAdapterPosition在项目从 中删除之前ViewHolder,然后getAbsoluteAdapterPosition将返回0(因为视图仍在 中ViewHolder)并getBindingAdapterPosition返回-1(因为它不再存在于适配器中)。


我通过记录以下内容测试了差异:

Log.e("difference", "getAdapterPosition = "+myHolder.getAdapterPosition()+" getBindingAdapterPosition = "+myHolder.getBindingAdapterPosition()+" getAbsoluteAdapterPosition = "+myHolder.getAbsoluteAdapterPosition());
Run Code Online (Sandbox Code Playgroud)

它们返回完全相同的值。我看不出任何区别。

在调用notifyItemChanged,notifyDataSetChanged或之后,我也看不出有什么区别notifyItemRangeChanged。但是当我删除位置0并调用notifyItemRemoved-1之后返回(对于所有这些)。

我的问题

我是否正确理解这一点,我们什么时候应该使用哪个?另外,什么时候会有所不同?

Gab*_*tti 62

recyclerview:1.2.0-alpha02介绍了MergeAdapter已经更名为ConcatAdapterrecyclerview:1.2.0-alpha04
这个 RecyclerView Adapter 可以线性组合多个适配器

就像是:

FirstAdapter adapter1 = ...;
SecondAdapter adapter2 = ...;
ConcatAdapter merged = new ConcatAdapter(adapter1, adapter2);
recyclerView.setAdapter(mergedAdapter);
Run Code Online (Sandbox Code Playgroud)

作为此更改的一部分,该方法getAdapterPosition()已被弃用,因为该名称在适配器嵌套其他适配器时会引起混淆。现在您应该使用getBindingAdapterPosition()返回特定适配器( bindingAdapter) 中位置的方法。

还检查的源代码RecyclerView.ViewHolder

    @Deprecated
    public final int getAdapterPosition() {
        return getBindingAdapterPosition();
    }
Run Code Online (Sandbox Code Playgroud)

相反,该方法getAbsoluteAdapterPosition()返回项目相对于整个 的 Adapter 位置RecyclerView。如果您使用的ConcatAdapter是a它是ConcatAdapter在单个 bindingAdapter 中的位置而不是位置。

只是一个带有 2 个适配器的示例:

在此处输入图片说明

官方博客文章中提供了更多详细信息。

  • 如果只有一个适配器,则所有出现的“getAdapterPosition”都应更改为“getBindingAdapterPosition”。正确的? (5认同)
  • 这是否意味着绑定适配器位置就是我们从模型列表中获取正确数据所需的位置,因为调用 getAdapterPosition 现在只在内部使用 getBindingAdapterPosition ? (3认同)
  • @SouravKannanthaB 是的 (2认同)