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

所属分类: 软件编程 / Android 阅读数: 1504
收藏 0 赞 0 分享

为 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增加监听以及数据混乱的小坑就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Android动态加载Activity原理详解

这篇文章主要介绍了Android动态加载Activity原理详解的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Android App中实现相册瀑布流展示的实例分享

这篇文章主要介绍了Android App中实现相册瀑布流展示的实例分享,例子中利用到了缓存LruCache类的相关算法来解决大量加载问题,需要的朋友可以参考下
收藏 0 赞 0 分享

Android开发中ImageLoder进行图片加载和缓存

这篇文章主要介绍了Android开发中ImageLoder进行图片加载和缓存的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Android Activity之间切换传递数据的方法

这篇文章主要介绍了详解Android Activity之间切换传递数据的方法 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Android 手机卫士设置向导页面

这篇文章主要介绍了详解Android 手机卫士设置向导页面的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

深入浅析Android手机卫士保存密码时进行md5加密

一般的手机没有root权限,进不去data/data目录,当手机刷机了后,拥有root权限,就可以进入data/data目录,查看我们保存的密码文件,因此我们需要对存入的密码进行MD5加密,接下来通过本文给大家介绍Android手机卫士保存密码时进行md5加密,需要的朋友一起学习
收藏 0 赞 0 分享

Android仿百度外卖自定义下拉刷新效果

大家在使用百度外卖的订餐的时候,会看到有个下拉刷新功能非常不错,今天小编就通过代码给大家介绍android仿百度外卖自定义下拉刷新,感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

详解Android中Service服务的基础知识及编写方法

这篇文章主要介绍了详解Android中Service服务的基础知识及编写方法,包括Service的启动流程及生命周期等基本内容,需要的朋友可以参考下
收藏 0 赞 0 分享

实例讲解Android中的AIDL内部进程通信接口使用

这篇文章主要通过实例介绍了Android中的AIDL内部进程通信接口使用,文中通过一个音乐播放的服务编写例子来讲解AIDL的传递对象及一般使用步骤,需要的朋友可以参考下
收藏 0 赞 0 分享

浅析Android系统的架构以及程序项目的目录结构

这篇文章主要介绍了Android系统的架构以及程序项目的目录结构,是安卓开发入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多