RecyclerView中不同的位置概念可以帮助你更有效地处理数据项和用户交互

移动开发 移动应用
如果ViewHolder当前没有与任何项关联(例如,因为该项已经从列表中移除或者ViewHolder正在被回收),返回RecyclerView.NO_POSITION,值为-1。

getAdapterPosition

getAdapterPosition()是RecyclerView.ViewHolder类的一个方法,用于获取与该ViewHolder关联的项目在适配器(Adapter)中的位置。在数据绑定、点击事件处理、以及需要知道项目在列表或网格中具体位置的其他场景中非常有用。

从RecyclerView的onBindViewHolder、onClick或其他与ViewHolder相关的回调中使用getAdapterPosition方法时,会返回与当前ViewHolder绑定的数据项在适配器中的索引。

  1. 「数据变更」:在getAdapterPosition()被调用之前,适配器中的数据发生了变更(例如,通过notifyDataSetChanged(), notifyItemInserted(), notifyItemRemoved(), 等方法),ViewHolder可能会因为回收和重用而与实际位置不同步,返回的位置可能不再反映当前UI状态。
  2. 「ViewHolder的复用」:RecyclerView为了提高性能,会复用ViewHolder实例来绑定不同的数据项。即使ViewHolder被重用于表示新的数据项,getAdapterPosition()也会返回新的数据项在适配器中的位置。
  3. 「无效位置」: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 实例可能会被用来绑定不同位置上的数据。

  1. 「getAdapterPosition()」

返回的是当前 ViewHolder 最后绑定数据时的适配器位置(在数据最后一次变化后的位置)。

如果在数据变化后,ViewHolder 没有被重新绑定,返回的可能是之前的位置。

  1. 「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相关的位置方法会更为合适。

责任编辑:武晓燕 来源: 沐雨花飞蝶
相关推荐

2009-12-11 17:39:47

VS 2008数据

2016-08-04 16:04:56

2013-09-22 11:39:05

SAP

2018-11-26 07:23:08

数据数据分析

2021-01-22 15:39:51

区块链比特币货币

2012-02-08 16:45:20

ibmdw

2024-04-11 09:30:00

大数据物联网楼宇自控

2022-05-07 09:32:01

Ubuntu编程Linux

2020-04-24 14:00:21

NVMeTCP存储

2020-03-27 09:29:03

闪存存储分解

2009-02-27 14:21:01

LinuxRuby系统管理

2020-04-09 10:18:20

人工智能新冠疫情数据

2021-03-31 08:34:52

安全扫描网络安全网络攻击

2014-12-10 10:51:54

OpenStackSahara云计算

2023-07-11 07:00:00

首席信息官首席技术官营业利润率

2019-02-14 10:32:19

2021-06-15 07:33:13

Java函数式编程

2018-11-30 10:59:23

公有云成本云计算

2024-09-26 10:51:51

2017-08-18 08:40:40

OpenStack建模数据中心
点赞
收藏

51CTO技术栈公众号