相关文章推荐
狂野的橡皮擦  ·  ThreeJS ...·  2 周前    · 
酷酷的柑橘  ·  Android ...·  1 周前    · 
犯傻的沙滩裤  ·  王恒·  4 天前    · 
高大的火龙果  ·  arkts ...·  3 月前    · 
深情的水桶  ·  quill-blot-formatter ...·  4 月前    · 
干练的围巾  ·  基于Tesseract.js的Vue ...·  1 年前    · 
本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议 》和 《 阿里云开发者社区知识产权保护指引 》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单 进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

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


看过我这边文章的RecyclerView.Adapter的优化与封装的真的想说声抱歉,其实不需要继承BaseBean,只需要继承Object就可以了,而且更灵活了,当时不知道咋了,脑袋抽风了,多次了这一举。 好了,今天来一个更牛逼的神器RefreshLayout