×

7.如何给RecyclerView添加Click和LongClick事件

96
Pich
2017.04.04 13:33 字数 456
/**
 * 作者:Pich
 * 原文链接:http://me.woblog.cn/
 * QQ群:129961195
 * 微信公众号:woblog
 * Github:https://github.com/lifengsofts
 */

详解RecyclerView系列文章目录

概述

如果你做Android开发,那么你肯定听过RecyclerView没有提供Click和LongClick事件的默认实现。不知道官方这是个什么用意,那么这节课程就来实现这个功能,实现完成的效果图如下图所示:


这里我们不讲过分的封装,现在只是随便写,目的就是更容易懂。后面的到封装的课程会讲进一步的封装。

添加OnItemClickListener

public interface OnItemClickListener {

  void onItemClick(ViewHolder holder,int position);
}

添加一个接口,用来在adapter里面点击事件后回调到你需要的位置。

在adapter中实现点击事件

public void onBindViewHolder(final CardViewActivity.MyAdapter.MyViewHolder holder,
    final int position) {
  String d = CardViewActivity.this.data.get(position);
  holder.bindData(d, position);
  if (onItemClickListener != null) {
    holder.itemView.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        onItemClickListener.onItemClick(holder,position);
      }
    });

  }
}

这里我们先判断onItemClickListener是否为空,然后在设置点击事假,这样比一上来就设置点击监听器,然后再点击事件里面在判断监听器是否为空更节省资源。

处理点击事件

接下来就可以在回调的方法里面处理点击事件了。

String s = data.get(position);
Intent intent = new Intent(this, NewsDetailActivity.class);
intent.putExtra(NewsDetailActivity.URL, s);
startActivity(intent, options.toBundle());

长按事件也就很简单了,可以直接改上面的监听器,在添加一个方法,也可以在创建一个接口,我们这里再创建一个接口。

创建OnItemLongClickListener

public interface OnItemLongClickListener {
  boolean onItemLongClick(ViewHolder holder,int position);
}

特别注意的是我们在回调中传入了ViewHolder,这样的好处是,我们在点击事件里面就可以拿到相应的view,可以直接执行一些动画,不用再次拿到View在findViewById了。

处理长按事件

这个没必要多说了,大家基本都会,但是要注意的是onItemLongClick有返回值,他根据返回时判断是否在调用OnItemClick,所以这个地方一定要根据实际情况返回不同的值。

@Override
public boolean onItemLongClick(ViewHolder holder, int position) {
  Toast.makeText(this, "Long Click", Toast.LENGTH_SHORT).show();
  return true;
}
RecyclerView
Web note ad 1