关于RecycleView的getPosition(),getAdapterPosition()过时和getBindingAdapterPosition、getLayoutPosition..的总结

简介: 在App的开发过程中,常常会用的RecycleView,毕竟他可以横着来,竖着来,嵌套着来,而每个列表,我们通常都会写一个相对应的适配器(Adapter),里面包含了初始化,赋值,一些数据的监听,一些动作的监听等等。

  在App的开发过程中,常常会用的RecycleView,毕竟他可以横着来,竖着来,嵌套着来,而每个列表,我们通常都会写一个相对应的适配器(Adapter),里面包含了初始化,赋值,一些数据的监听,一些动作的监听等等。


       而对于position,即item所处的位置属性,我们也常常会用到它。而对于几个position的方法,想了想还是得区分总结一下,加深下印象。


1.getPositon()和onBindViewHolder()方法里的参数position


       记得很久以前会用到getPositon()方法,不过这个方法早弃用了。以下源码


@Deprecated
public final int getPosition() {
   return mPreLayoutPosition == NO_POSITION ? mPosition : mPreLayoutPosition;
}

       弃用的原因:


此方法已弃用,因为它的含义是不明确的,因为适配器更新是异步处理的。您应该使用getLayoutPosition(), getBindingAdapterPosition()或getAbsoluteAdapterPosition(),这取决于您的用例。


       onBindViewHolder()里的position,我们可以使用position将数据绑定到视图,可以使用position参数来执行此操作,但不能使用position参数来处理用户点击,如果您使用它,您会看到一个警告告诉您“不要position视为固定并holder.getAdapterPosition()改为使用”。


2.getAdapterPosition()


       后面就一直就用的adapterPosition(),然后最近发现也过期了,来看看源码


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

       弃用:原因当适配器嵌套其他适配器时,这种方法会造成混淆。如果你在一个适配器的环境中调用它,你可能想要调用getBindingAdapterPosition(),或者如果你想要的位置是RecyclerView看到的,你应该调用getAbsoluteAdapterPosition()。看来是为了适配新的需求,所以在getAdapterPosition的基础上扩展开了这两种方法。那么常规的展示同一种数据类型的adapter还是使用getAbsoluteAdapterPosition或者getAdapterPosition也是可以的。


     


      特性: 关于getAdapterPosition,此方法始终包含更新后的适配器的位置holder。这意味着每当您单击一个item时,您都会向适配器询问它的position. 所以你会得到这个item在适配器逻辑方面的最新位置。getAdapterPosition()它会返回数据在Adapter中的位置(也许位置的变化还未来得及刷新到布局中),当使用Adapter的时候(例如调用Adapter的刷新相关方法时)可考虑使用


3.getLayoutPosition()


       既然提到了getAdapterPosition()方法,那也不得不提一下getLayoutPosition()


       它返回ViewHolder在最新布局中的适配器位置,即用户看到布局的最新位置。


       根据代码中的解释,在Recyclerview 进行添加、移除item等操作时,position位置可能会变化,而所有的adapter的刷新并不总是及时的,只有这个方法返回的才是当前item经过一些变换后所处的真正位置。此外,点击事件用这个也没毛病哈


4.getBindingAdapterPosition()和getAbsoluteAdapterPosition()


       Google废弃了getAdapterPosition()方法,但是却又提供了getBindingAdapterPosition()和getAbsoluteAdapterPosition()这两个方法。从方法名可以看出来,一个是用于获取元素位于当前绑定Adapter的位置,一个是用于获取元素位于Adapter中的绝对位置(一般常用的就是这个)。


       因为,一个列表可能不只有一个adapter,可能你列表的顶部需要展示一部分数据,底部又展示一部分数据,这时候可以直接一个列表和来展示,之前使用viewtype来根据位置来区分,不过位置的计算很麻烦,因为IM列表一直在刷新,这儿我看了下郭霖大神的博客,使用的是MergeAdapter,有点骚气,有兴趣的可以去看看。也代码展示了俩个方法的区别


相关文章
|
XML 前端开发 Java
Android App开发图像加工中卡片视图CardView和给图像添加装饰的讲解以及实战(附源码 简单易懂)
Android App开发图像加工中卡片视图CardView和给图像添加装饰的讲解以及实战(附源码 简单易懂)
763 0
|
Android开发
Android JNI与CAN通信遇到的问题总结
Android JNI与CAN通信遇到的问题总结
674 1
|
API Android开发 容器
33. 【Android教程】悬浮窗:PopupWindow
33. 【Android教程】悬浮窗:PopupWindow
2075 2
|
XML JSON Java
Android App开发即时通信中通过SocketIO在客户端与服务端间传输文本和图片的讲解及实战(超详细 附源码)
Android App开发即时通信中通过SocketIO在客户端与服务端间传输文本和图片的讲解及实战(超详细 附源码)
863 0
|
9月前
|
机器学习/深度学习 编解码 BI
YOLOv11改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用
YOLOv11改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用
386 3
YOLOv11改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用
|
API Android开发
31. 【Android教程】状态栏通知:Notification
31. 【Android教程】状态栏通知:Notification
1509 1
|
XML Java 开发工具
在Android中使用ProgressBar显示进度
在Android中使用ProgressBar显示进度
1685 2
|
Android开发 开发者 UED
使用AlarmManager实现Android应用中的定时任务
使用AlarmManager实现Android应用中的定时任务
|
前端开发 小程序 JavaScript
面试官:px、em、rem、vw、rpx 之间有什么区别?
面试官:px、em、rem、vw、rpx 之间有什么区别?
363 0
|
Java Android开发
解决AGP升级到8.0后编译报错kaptGenerateStubsDebugKotlin
解决AGP升级到8.0后编译报错kaptGenerateStubsDebugKotlin
1436 0