Recycleview的点击事件

来源:互联网 发布:员工管理系统数据库表 编辑:程序博客网 时间:2024/05/22 08:17

对于recycleview都不陌生,下面分享一下关于recycleview的点击事件
新建一个RecyclerViewClickListener.java

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) {    }}

然后在主方法直接调用就好

 //调用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();    }}));

就这么多,没了