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已经更名为ConcatAdapter有recyclerview: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 个适配器的示例:
官方博客文章中提供了更多详细信息。
| 归档时间: |
|
| 查看次数: |
9103 次 |
| 最近记录: |