getAdapterPosition
getAdapterPosition()是RecyclerView.ViewHolder类的一个方法,用于获取与该ViewHolder关联的项目在适配器(Adapter)中的位置。在数据绑定、点击事件处理、以及需要知道项目在列表或网格中具体位置的其他场景中非常有用。
从RecyclerView的onBindViewHolder、onClick或其他与ViewHolder相关的回调中使用getAdapterPosition方法时,会返回与当前ViewHolder绑定的数据项在适配器中的索引。
- 「数据变更」:在getAdapterPosition()被调用之前,适配器中的数据发生了变更(例如,通过notifyDataSetChanged(), notifyItemInserted(), notifyItemRemoved(), 等方法),ViewHolder可能会因为回收和重用而与实际位置不同步,返回的位置可能不再反映当前UI状态。
- 「ViewHolder的复用」:RecyclerView为了提高性能,会复用ViewHolder实例来绑定不同的数据项。即使ViewHolder被重用于表示新的数据项,getAdapterPosition()也会返回新的数据项在适配器中的位置。
- 「无效位置」:ViewHolder不再与任何数据项关联(例如,由于列表项被完全移除或滚动出屏幕),getAdapterPosition()可能会返回RecyclerView.NO_POSITION(-1)。在使用getAdapterPosition()之前,最好检查返回值是否有效。
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int adapterPosition = holder.getAdapterPosition();
if (adapterPosition != RecyclerView.NO_POSITION) {
// 处理点击事件,使用adapterPosition作为索引
}
}
});
}
图片
遗憾的是getAdapterPosition方法标记为过期废弃了。
getBindindAdapterPosition
getBindingAdapterPosition() 是 RecyclerView.ViewHolder 类的一个方法,与 getAdapterPosition() 类似,但用途上略有不同。
RecyclerView 通过 LayoutManager 来确定每个项目的位置和大小,并使用 Adapter 来提供数据和将数据绑定到视图上。为了优化性能,RecyclerView 会复用 ViewHolder 对象,这意味着同一个 ViewHolder 实例可能会被用来绑定不同位置上的数据。
- 「getAdapterPosition()」
返回的是当前 ViewHolder 最后绑定数据时的适配器位置(在数据最后一次变化后的位置)。
如果在数据变化后,ViewHolder 没有被重新绑定,返回的可能是之前的位置。
- 「getBindingAdapterPosition()」
只在 onBindViewHolder() 方法的上下文中有效。
返回的是当前正在绑定到 ViewHolder 的数据项在适配器中的位置。
在 onBindViewHolder() 方法之外调用此方法可能会返回 RecyclerView.NO_POSITION(-1),此时 ViewHolder 可能没有绑定到任何数据项。
getAbsoluteAdapterPosition
getAbsoluteAdapterPosition()是RecyclerView.ViewHolder的一个方法,用于获取与ViewHolder关联的项在适配器中的绝对位置。
- 当RecyclerView的适配器是嵌套的时候,使用getAbsoluteAdapterPosition()可以获取到嵌套的RecyclerView中项在外部RecyclerView适配器中的绝对位置。
- 与getAdapterPosition()相比,getAbsoluteAdapterPosition()考虑了所有嵌套的RecyclerView层级,并返回了一个全局的、唯一的、不受层级影响的位置。
1.「返回值」
如果ViewHolder当前与某个项关联,返回一个大于或等于0的整数,表示该项在适配器中的绝对位置。
如果ViewHolder当前没有与任何项关联(例如,因为该项已经从列表中移除或者ViewHolder正在被回收),返回RecyclerView.NO_POSITION,其值为-1。
2.「注意事项」
getAbsoluteAdapterPosition()考虑了嵌套的RecyclerView层级,返回的位置可能与直接通过getAdapterPosition()获得的位置不同。
当处理嵌套RecyclerView的交互或数据时,使用getAbsoluteAdapterPosition()可以确保获取到的是全局的、唯一的位置。
getAbsoluteAdapterPosition()也可能在ViewHolder被回收或没有与任何项关联时返回RecyclerView.NO_POSITION,在使用其返回值之前应进行检查。
getLayoutPosition
getLayoutPosition()是RecyclerView.ViewHolder类的一个方法,用于获取ViewHolder在当前的布局中的位置。这个位置是基于当前屏幕上可见的项和RecyclerView的滚动状态来确定的。
1.「使用场景」
当需要知道ViewHolder在屏幕上的当前位置(而不仅仅是它在适配器中的位置)时,可以使用getLayoutPosition()。
与getAdapterPosition()不同,getLayoutPosition()返回的是ViewHolder在当前可见项列表中的位置,它可能因滚动而发生变化。
2.「返回值」
如果ViewHolder当前与某个项关联并且在屏幕上可见,返回一个大于或等于0的整数,表示该项在当前布局中的位置。
如果ViewHolder当前没有与任何项关联(例如,因为该项已经从列表中移除或者ViewHolder正在被回收),返回RecyclerView.NO_POSITION,值为-1。
3.「注意事项」getLayoutPosition()返回的位置是基于当前屏幕上可见的项和RecyclerView的滚动状态来确定的。如果滚动了RecyclerView,即使项的适配器位置没有变化,它的布局位置也可能会变化。
如果ViewHolder已经被RecyclerView回收或不再与任何项关联,getLayoutPosition()将返回RecyclerView.NO_POSITION。
在大多数情况下,如果需要处理与项相关的数据或事件,并且不关心这些项在屏幕上的具体位置,使用Adapter相关的位置方法会更为合适。