关于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开发
Android App开发网络通信中使用okhttp下载和上传图片、文件讲解及实战(超详细实现用户注册信息上传 附源码)
Android App开发网络通信中使用okhttp下载和上传图片、文件讲解及实战(超详细实现用户注册信息上传 附源码)
1652 0
|
Android开发 开发者 存储
Android可折叠收缩伸展的Expandable分组RecyclerView:模型抽象和封装(二)
Android可折叠收缩伸展的Expandable分组RecyclerView:模型抽象和封装(二) 如今Android这种可收缩伸展的Expandable RecyclerView是如此常用,在附录1的基础上,我重新把模型进行了抽象和封装,设计了一套新的架构和简洁的使用方式支持这种功能。
4482 0
|
编解码 Linux Android开发
安卓投屏神器 Scrcpy 安装与使用(支持 Mac、Windows、Linux)
安卓投屏神器 Scrcpy 安装与使用(支持 Mac、Windows、Linux)
52596 1
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
1966 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
XML JSON Java
Android App开发即时通信中通过SocketIO在客户端与服务端间传输文本和图片的讲解及实战(超详细 附源码)
Android App开发即时通信中通过SocketIO在客户端与服务端间传输文本和图片的讲解及实战(超详细 附源码)
1151 0
|
API Android开发 容器
33. 【Android教程】悬浮窗:PopupWindow
33. 【Android教程】悬浮窗:PopupWindow
2576 2
|
Android开发
Android中如何快速的实现RecycleView的拖动重排序功能
使用`ItemTouchHelper`和自定义`Callback`,在`RecyclerView`中实现拖动排序功能。定义`ItemTouchHelperAdapter`接口,`Adapter`实现它以处理`onItemMove`方法。`SimpleItemTouchHelperCallback`设置拖动标志,如`LEFT`或`RIGHT`(水平拖动),并绑定到`RecyclerView`以启用拖动。完成这些步骤后,即可实现拖放排序。关注公众号“AntDream”获取更多内容。
558 3
|
Android开发
DialogFragment 使用指南:几个小问题的解法
DialogFragment是Android中用于创建弹窗的特殊Fragment,继承自Fragment。使用步骤包括:1. 创建子类,2. 在onCreateView加载布局,3. onViewCreated初始化控件,4. 通过show方法显示。示例代码展示了一个基本的DialogFragment及其布局。此外,文中还解答了三个常见问题:如何设置弹窗宽度为match_parent,如何使弹窗位于屏幕底部,以及如何去除弹窗四周的默认padding。每个问题都提供了相应的解决方案,涉及在onStart中调整窗口参数和设置自定义样式。
1859 2
DialogFragment 使用指南:几个小问题的解法
|
Java 开发工具
开发工具系列 之 同一个电脑上安装多个版本的JDK
这篇文章介绍了如何在一台电脑上安装和配置多个版本的JDK,包括从官网下载所需JDK、安装过程、配置环境变量以及如何查看和切换当前使用的JDK版本,并提到了如果IDEA和JDK版本不兼容时的解决方法。
开发工具系列 之 同一个电脑上安装多个版本的JDK
|
Java Android开发 Windows
使用keytool查看Android APK签名
本文介绍了如何使用Windows命令行工具和keytool查看APK的签名信息,并提供了使用AOSP环境中的signapk.jar工具对APK进行系统签名的方法。
2752 0
使用keytool查看Android APK签名