Recyclerview的一个容易被忽略的方法getAdapterPosition

问题

在Recyclerview实现的列表实现点击事件,点击的时候,根据不同的位置position来操作。

      content2.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        LogUtils.d("ShopCartItemType onItemClick  root222= ");
                        mDelegate.get().jumpToGoodsDetails(holder.getAdapterPosition());
                    }
                });

一般情况下没有问题,但如果当你点击的时候,Recyclerview正在刷新视图,这个时候getAdapterPosition就会取值到-1
打印的日志如下:
在这里插入图片描述

解决方法

第一种:用getLayoutPosition方法替代
getAdapterPosition() 与 getLayoutPosition() 的区别
  getAdapterPosition 与 getLayoutPosition 方法是google替代 getPosition提供的新api。 你们也可以在Android studio上看他们的注释了解下google的想法。

个人认为getAdapterPosition() 是提供数据在刷新的时候提供一个-1的返回值,来告知视图其实正在重新绘制。这个时候点击位置与你想要的数据正在变化中是不一致的。(因为绘制View与数据位置这2组内容其实是异步的,所以Position理所当然的是不准确的)

而getLayoutPosition()更加简单暴力,你点击不会告诉你数据是否正在刷新,始终会返回一个位置值。这个位置值有可能是之前的视图item位置,也有可能是刷新视图后的item位置。

那么问题来了,应该如何取舍他们或者在什么情况下使用他们呢?

getLayoutPosition() 更适合在短时间内数据变动少,View刷新不频繁的情况下使用,或者是固定列表数据,一切简单化没这么复杂。

getAdapterPosition() 更适合在频繁变动数据的情况下使用,指那种数据刷新极快而且是连续刷新的情况下使用,-1的无位置的返回值告诉你视图正在变化,你需要判断是否执行这次点击。

第二种:判断等于了-1就不执行逻辑

      content2.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        LogUtils.d("ShopCartItemType onItemClick  root222= ");
                        if (mDelegate != null && holder.getAdapterPosition() != RecyclerView.NO_POSITION)
                            mDelegate.get().jumpToGoodsDetails(holder.getAdapterPosition());
                    }
                });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值