RecyclerView itme 点击事件和长按事件,onItemLongClick,onItemClick

众所周知 RecyclerView 比listview 要强大很多,现在多数android开发人员都使用RecyclerView 代替listview 。但在刚开始使用过程相信大家都遇到这个问题 ,就是RecyclerView 没有自带点击事件(onItemClick)和长按事件(onItemLongClick),

在这里把自己的写法分享出来,希望对部分刚接触的开发者有帮助。

第一种方式:

通过OnItemTouchListener自定义 点击接口。如下

/**
 * 自定义手势监听
 */
public class RecyclerViewClickListener implements RecyclerView.OnItemTouchListener {

    // GestureDetectorCompat 是为了版本兼容
    private GestureDetectorCompat mGestureDetector;
    private OnItem2ClickListener mListener;

    //自定义内部监听
    public interface OnItem2ClickListener {
        //单击
        void onItemClick(View view, int position);

        //长按
        void onItemLongClick(View view, int position);
    }

    public RecyclerViewClickListener(Context context, final RecyclerView mRecyclerView, OnItem2ClickListener listener) {
        this.mListener = listener;
        // SimpleOnGestureListener 是为了选择重写需要的方法
        mGestureDetector = new GestureDetectorCompat(context, new GestureDetector.SimpleOnGestureListener() {
            //单击事件
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                Log.i("mGestureDetector","onSingleTapUp");
                View childViewUnder = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
                if (childViewUnder != null && mListener != null) {
                    mListener.onItemClick(childViewUnder, mRecyclerView.getChildLayoutPosition(childViewUnder));
                    return true;
                }
                return false;
            }

            //长按事件
            @Override
            public void onLongPress(MotionEvent e) {
                Log.i("mGestureDetector","onLongPress");
                View childView = mRecyclerView.findChildViewUnder(e.getX(),e.getY());
                if(childView != null && mListener != null){
                    mListener.onItemLongClick(childView,mRecyclerView.getChildLayoutPosition(childView));
                }
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        //是否拦截事件交给 mGestureDetector 处理
        if(mGestureDetector.onTouchEvent(e)){
            return true;
        }else
            return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }

在activity 集成接口OnItem2ClickListener,并实现方法。

public class MessageFragment extends BaseFragment implements RecyclerViewClickListener.OnItem2ClickListener{
  @Override
    public void onItemClick(View view, int postion) {

    }

    @Override
    public void onItemLongClick(View view, int position) {

    }

}

第二种

在adapter种实现接口 具体实现可以看我以前的的另一篇文章。

https://blog.csdn.net/qq_36355271/article/details/86242606 

//activity通过 实现adapter中的接口  已达到控制效果。

猜你喜欢

转载自blog.csdn.net/qq_36355271/article/details/87931627
今日推荐