最近在项目中做侧滑删除的时候总是出现点击删除这个删除的却是那个,经过研究发现问题如下
拿recylerview来说吧,以下是错误代码
@Override
public void onBindViewHolder(MyAdapter.MyHolder holder, final int position) {
holder.text.setText(list.get(position));
holder.delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(v, position);
}
});
}
我们在bind方法设置点击事件的监听器的时候,由于在匿名内部类中,所以position要变final,但是这样就会出问题,position随着bind方法在不停的绑定而改变,所以它不可以变final,其实studio是有提示的,它建议用holder.getAdapterPosition()方法,这就引入了第二种错误代码
@Override
public void onBindViewHolder(MyAdapter.MyHolder holder,int position) {
final int position1 = holder.getAdapterPosition();
holder.text.setText(list.get(position));
holder.delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(v, position1);
}
});
}
虽然上面用了holder.getAdapterPosition()方法,但是将得到的position又变final了,还是会使界面在删除的时候错乱,所以正确的代码如下
@Override
public void onBindViewHolder(final MyAdapter.MyHolder holder, int position) {
holder.text.setText(list.get(position));
holder.delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(v, holder.getAdapterPosition());
}
});
}
将holder变final,在需要用position的地方用holder.getAdapterPosition()获取
好了,一点小经验与大家分享,希望每个人都能把自己踩过的坑写出来,让大家不必再踩同样的坑了