当前位置: 移动技术网 > 移动技术>移动开发>Android > 浅谈Android为RecyclerView增加监听以及数据混乱的小坑

浅谈Android为RecyclerView增加监听以及数据混乱的小坑

2019年07月24日  | 移动技术网移动技术  | 我要评论

为 recyclerview增加监听

1、在实现好的myadapter中写内部接口:

public void setonitemlongclicklistener(onitemlongclicklistener onitemlongclicklistener) {
  this.onitemlongclicklistener = onitemlongclicklistener;
}
public void setonitemclicklistener(onitemclicklistener onitemclicklistener) {
  this.onitemclicklistener = onitemclicklistener;
}
<!--点击监听-->
public interface onitemclicklistener {
  void onitemclick(view view, int pos);
}

<!--长按监听-->
public interface onitemlongclicklistener {
  void onitemlongclick(view view, int position);
}

2、继续在myadapter中增加以下代码:

public class myadapter extends recyclerview.adapter<myadapter.viewholder> {

private onitemclicklistener onitemclicklistener;
private onitemlongclicklistener onitemlongclicklistener;
      ......

@override
public void onbindviewholder(viewholder holder, int position) {

  final int pos = holder.getlayoutposition();
  holder.mtextview.setonclicklistener(new view.onclicklistener() {
    @override
    public void onclick(view view) {
      if (onitemclicklistener != null)
        onitemclicklistener.onitemclick(view, pos);
    }
  });

  holder.mtextview.setonlongclicklistener(new view.onlongclicklistener() {
    @override
    public boolean onlongclick(view view) {
      if (onitemlongclicklistener != null) {
        onitemlongclicklistener.onitemlongclick(view, pos);
      }
      return true;
    }
  });

}
}

以上代码是接口一般的写法,没什么难度,需要注意的是几个局部刷新的方法。

3、为了将性能提升至极致,recyclerview的视图中某个item数据变化时,recyclerview.adapter提供几个局部刷新数据视图的方法:

//该方法用于当增加一个数据的时候,position表示新增数据显示的位置
final void notifyiteminserted(int position)

//该方法用于删除一个数据的时候,position表示数据删除的位置
final void notifyitemremoved(int position)

//该方法表示所在position对应的item位置不会改变,但是该item内容发生变化
final void notifyitemchanged(int position)

//当然也还有老方法全部刷新,该方法一般用于:适配器之前装载的数据大部分已经过时了,需要重新更新数据调用 
//该方法的时候,recyclerview会重新计算子item及所有子item重新布局,简单但是效率低并且不带默认的动画:

final void notifydatasetchanged()

出于效率考虑,官方建议用更加精确的方法(比如上面三个方法)来取代这个方法:

①.在recyclerview.viewholder中说提及position(下标)时,有两种情况:

i.由viewholder的 getlayoutposition() 方法返回的,是视图中 itemview 的下标

i.由viewholder的 getadapterposition() 方法返回的,是adapter数据集(如arraylist) data元素 的下标.

正常时,第几个itemview上显示地接个data的内容,两者一一对应。

②. 但是在使用局部刷新的几个方法时要注意,我们知道,一个数据集比如arraylist,移除某个元素时,它后面的元素会向前填充,所以后面每个元素的下标都会减一;

③. 然而对于 getlayoutposition() 来讲,当我们用 notifyiteminserted 方法移除掉一个itemview时,视图上看后面的itemview会挤上去,但是它们的下标是没有变的。比如十个itemview(下标0到9)我用 notifyiteminserted 方法移除了第三个, 那么视图中剩下的itemview的下标就是(0,1和3到9), 这时候再去对数据集调用remove(9)的话势必会抛出数组越界异常;

④. 因此在每次刷新后,要使用 notifyitemrangechanged(int positionstart,int itemcount) 调整itemview的下标,使其和数据集的下标始终是一一对应。其中 positionstart 是第一个改变的itemview下标,itemcount指它后面下标也需要改变的itemview个数

以上是recyclerview的初级具体使用方法。

这篇浅谈android为recyclerview增加监听以及数据混乱的小坑就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网