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

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

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

&岁月不待人&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值