Recyclerview的点击事件

来源:互联网 发布:知乎有趣的话题 编辑:程序博客网 时间:2024/05/19 12:18

recyclerview的点击事件最简单的方法
先写一个类

public class RecyclerViewClickListener implements RecyclerView.OnItemTouchListener {    private int mLastDownX,mLastDownY;    //该值记录了最小滑动距离    private int touchSlop ;    private OnItemClickListener mListener;    //是否是单击事件    private boolean isSingleTapUp = false;    //是否是长按事件    private boolean isLongPressUp = false;    private boolean isMove = false;    private long mDownTime;    //内部接口,定义点击方法以及长按方法    public interface OnItemClickListener {        void onItemClick(View view, int position);        void onItemLongClick(View view, int position);    }    public RecyclerViewClickListener(Context context,OnItemClickListener listener){        touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();        mListener = listener;    }    @Override    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {        int x = (int) e.getX();        int y = (int) e.getY();        switch (e.getAction()){            /**             *  如果是ACTION_DOWN事件,那么记录当前按下的位置,             *  记录当前的系统时间。             */            case MotionEvent.ACTION_DOWN:                mLastDownX = x;                mLastDownY = y;                mDownTime = System.currentTimeMillis();                isMove = false;                break;            /**             *  如果是ACTION_MOVE事件,此时根据TouchSlop判断用户在按下的时候是否滑动了,             *  如果滑动了,那么接下来将不处理点击事件             */            case MotionEvent.ACTION_MOVE:                if(Math.abs(x - mLastDownX)>touchSlop || Math.abs(y - mLastDownY)>touchSlop){                    isMove = true;                }                break;            /**             *  如果是ACTION_UP事件,那么根据isMove标志位来判断是否需要处理点击事件;             *  根据系统时间的差值来判断是哪种事件,如果按下事件超过1ms,则认为是长按事件,             *  否则是单击事件。             */            case MotionEvent.ACTION_UP:                if(isMove){                    break;                }                if(System.currentTimeMillis()-mDownTime > 1000){                    isLongPressUp = true;                }else {                    isSingleTapUp = true;                }                break;        }        if(isSingleTapUp ){            //根据触摸坐标来获取childView            View childView = rv.findChildViewUnder(e.getX(),e.getY());            isSingleTapUp = false;            if(childView != null){                //回调mListener#onItemClick方法                mListener.onItemClick(childView,rv.getChildLayoutPosition(childView));                return true;            }            return false;        }        if (isLongPressUp ){            View childView = rv.findChildViewUnder(e.getX(),e.getY());            isLongPressUp = false;            if(childView != null){                mListener.onItemLongClick(childView, rv.getChildLayoutPosition(childView));                return true;            }            return false;        }        return false;    }    @Override    public void onTouchEvent(RecyclerView rv, MotionEvent e) {    }    @Override    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {    }}接着我们在MainActivity.java添加一段代码,同时不要忘记把方法一的代码注释掉哦: //调用RecyclerView#addOnItemTouchListener方法能添加一个RecyclerView.OnItemTouchListener对象 mRecyclerView.addOnItemTouchListener(new RecyclerViewClickListener(this,new RecyclerViewClickListener.OnItemClickListener() {    @Override    public void onItemClick(View view, int position) {        Toast.makeText(MainActivity.this,"Click "+mData.get(position),Toast.LENGTH_SHORT).show();    }    @Override    public void onItemLongClick(View view, int position) {        Toast.makeText(MainActivity.this,"Long Click "+mData.get(position),Toast.LENGTH_SHORT).show();    }}));

接下来就是在组件中调用方法

//调用RecyclerView#addOnItemTouchListener方法能添加一个RecyclerView.OnItemTouchListener对象 mRecyclerView.addOnItemTouchListener(new RecyclerViewClickListener(this,new RecyclerViewClickListener.OnItemClickListener() {    @Override    public void onItemClick(View view, int position) {        Toast.makeText(MainActivity.this,"Click "+mData.get(position),Toast.LENGTH_SHORT).show();    }    @Override    public void onItemLongClick(View view, int position) {        Toast.makeText(MainActivity.this,"Long Click "+mData.get(position),Toast.LENGTH_SHORT).show();    }}));
原创粉丝点击