RecyclerView 实现点击的另外一种方式

原创 2016年08月29日 11:59:06
1.前言:之前一直采用流行的方式来给RecyclerView的item设置点击方法,类似这样
  1.    @Override
  2.     public ViewHolder onCreateViewHolder(ViewGroup viewGroup,  int viewType) {
  3.         View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
  4.         ViewHolder vh = new ViewHolder(view);
  5.         //将创建的View注册点击事件
  6.         view.setOnClickListener(this);
  7.         return vh;
  8.     }
  9. 现在通过另外一种方式,去实现这个功能,基本逻辑就是利用GestureDector的特性,封装一个公共的类实现点击效果,废话不多少,上代码。

package com.example.android.recyclerview;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
    protected OnItemClickListener listener;
    private View childView;
    private GestureDetector gestureDetector;
    private int childViewPosition;
    public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
        this.gestureDetector = new GestureDetector(context, new GestureListener());
        this.listener = listener;
    }
    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        childView = rv.findChildViewUnder(e.getX(), e.getY());
        childViewPosition = rv.getChildPosition(childView);
        return childView != null && gestureDetector.onTouchEvent(e);
    }
    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    }
    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    }
    protected class GestureListener extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onSingleTapUp(MotionEvent event) {
            if (childView != null) {
                listener.onItemClick(childView, childViewPosition);
            }
            return true;
        }
        @Override
        public void onLongPress(MotionEvent event) {
            if (childView != null) {
                listener.onItemLongPress(childView, childViewPosition);
            }
        }
        @Override
        public boolean onDown(MotionEvent event) {
            // Best practice to always return true here.
            // http://developer.android.com/training/gestures/detector.html#detect
            return true;
        }
    }
    public interface OnItemClickListener{
        public void onItemClick(View childView, int position);
        public void onItemLongPress(View childView, int position);
    }
    public static abstract class SimpleOnItemClickListener implements OnItemClickListener {
        public void onItemClick(View childView, int position) {
            // Do nothing.
        }
        public void onItemLongPress(View childView, int position) {
            // Do nothing.
        }
    }

}

然后在调用的时候要这么些写,
mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getContext(),new OnItemClickListener()));
 private class OnItemClickListener extends RecyclerItemClickListener.SimpleOnItemClickListener {
        @Override
        public void onItemClick(View childView, int position) {
            Toast.makeText(getContext(),"点击第几个Item:" + position,Toast.LENGTH_SHORT).show();
        }
    }

个人感觉这种方式好在于封装,模拟了listView的点击方式,能拿到postion



【菜鸟之路】RecyclerView添加Item点击事件

今天下午继续在项目中学着做RecyclerView,想给每个Item添加一个点击跳转,翻了翻买的两本书发现没有呃,只能百度+看看网上前辈们的代码了。   翻了一些比较不错的文章,了解到大概的几种...
  • linyishui168
  • linyishui168
  • 2017年03月16日 19:56
  • 380

RecyclerView(一)点击事件的两种方式

recyclerview自身不带有点击事件的回调,以下实现recyclerview点击事件的两种方式1、通过接口回调的方式:直接上代码加注释 1、首先定义点击的接口public interface ...
  • Sunyard_HQL
  • Sunyard_HQL
  • 2017年01月13日 18:36
  • 2060

RecyclerView点击事件与长按事件,并添加点击效果

在网上找了一下实现方法,有的说在adapter里添加回调接口来实现点击事件与长按事件。  不过经过测试,有时候会产生这样的现象:点击item跳转到下一个页面,再返回回来时,  item的点击事件会失效...
  • gaobaoshen1
  • gaobaoshen1
  • 2016年06月14日 16:00
  • 2471

recyclerview之item点击事件监听

用过recyclerview的朋友们都知道,recyclerview不负责item视图的布局以及显示,所以也就没有为item开发点击事件,那么当我们需要对recyclerview的item做点击事件的...
  • HuaMnge
  • HuaMnge
  • 2016年12月16日 11:48
  • 1035

Android 解析RecyclerView(1)——带点击事件监听的通用Adapter

在之前我已经写过一篇关于设计通用Adapter的文章了:Android RecyclerView设计通用Adapter 按照最原始的做法,构建一个RecyclerView Adapter需要写挺多代...
  • new_one_object
  • new_one_object
  • 2017年06月07日 08:24
  • 747

Recyclerview--两行代码轻松添加点击选中效果

前言简单的实现Recyclerview选中效果,开发中很常见,比如点击item,后面加上选择按钮,亦或者类似CheckBox效果,可以用很少几行代码实现 实现直接贴代码,布局很简单,一个文字,后面一个...
  • dazhaoDai
  • dazhaoDai
  • 2017年03月10日 16:06
  • 2667

RecyclerView点击事件OnItemClick的两种实现方式

RecyclerView点击事件实现的两种方式support-library V7包中RecyclerView并没有为Item开放OnItemClick点击事件,所以开发者要自己实现。代码已上传到gi...
  • wangxinarhat
  • wangxinarhat
  • 2016年03月02日 20:04
  • 468

RecyclerView的Item点击事件实现总结

自从开始使用RecyclerView代替ListView,会发现有很多地方需要学习。前一段时间的学习记录有: RecyclerView的滚动事件研究 - DevWiki RecyclerView...
  • u014651216
  • u014651216
  • 2016年11月21日 11:43
  • 4881

RecyclerView添加点击事件与效果

Android,RecyclerView
  • cangely
  • cangely
  • 2016年06月27日 16:50
  • 5360

RecyclerView 添加头部和尾部,并实现Item的点击事件

RecyclerView添加头部和尾部,并实现Item的点击事件
  • lxfeng1098751554
  • lxfeng1098751554
  • 2015年12月26日 10:45
  • 2290
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RecyclerView 实现点击的另外一种方式
举报原因:
原因补充:

(最多只允许输入30个字)