关于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,有点骚气,有兴趣的可以去看看。也代码展示了俩个方法的区别


相关文章
|
Android开发
Android | Fragment.setUserVisibleHint()懒加载过时问题优化
Fragment.setUserVisibleHint()懒加载过时问题优化
587 0
|
XML Java 数据格式
Fragement基础
静态创建Fragment(要先添加依赖),静态创建的意思是不用在Java代码中加载Fragment,都在Activity的主XML文件中操作绑定Fragment。
103 0
|
缓存 算法
当RecyclerView滚动时它干了什么
当RecyclerView滚动时它干了什么
当RecyclerView滚动时它干了什么