问题
在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());
}
});