RecyclerView高效添加单击、长按事件最佳方案

来源:互联网 发布:h3c mac认证 编辑:程序博客网 时间:2024/04/29 00:11

转自:http://blog.csdn.net/liaoinstan/article/details/51200600
android开发游记:RecyclerView无法添加onItemClickListener最佳的高效解决方案

前言

之前最多的可能是在adapter中自己写一个itemClickListener来实现!下面使用RecyclerView中的addOnItemTouchListener()来实现!

实现

import android.support.v4.view.GestureDetectorCompat;import android.support.v7.widget.RecyclerView;import android.view.GestureDetector;import android.view.MotionEvent;import android.view.View;public abstract class OnRecyclerItemClickListener implements RecyclerView.OnItemTouchListener {    private GestureDetectorCompat mGestureDetector;    private RecyclerView recyclerView;    public OnRecyclerItemClickListener(RecyclerView recyclerView) {        this.recyclerView = recyclerView;        mGestureDetector = new GestureDetectorCompat(recyclerView.getContext(),                new ItemTouchHelperGestureListener());    }    public abstract void onItemClick(RecyclerView.ViewHolder viewHolder);    public abstract void onItemLongClick(RecyclerView.ViewHolder viewHolder);    @Override    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {        mGestureDetector.onTouchEvent(e);        return false;    }    @Override    public void onTouchEvent(RecyclerView rv, MotionEvent e) {        mGestureDetector.onTouchEvent(e);    }    @Override    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {    }    private class ItemTouchHelperGestureListener extends GestureDetector.SimpleOnGestureListener {        @Override        public boolean onSingleTapUp(MotionEvent e) {            View child = recyclerView.findChildViewUnder(e.getX(), e.getY());            if (child != null) {                RecyclerView.ViewHolder viewHolder = recyclerView.getChildViewHolder(child);                onItemClick(viewHolder);            }            return true;        }        @Override        public void onLongPress(MotionEvent e) {            View child = recyclerView.findChildViewUnder(e.getX(), e.getY());            if (child != null) {                RecyclerView.ViewHolder viewHolder = recyclerView.getChildViewHolder(child);                onItemLongClick(viewHolder);            }        }    }}

然后使用:

recyclerView.addOnItemTouchListener(new OnRecyclerItemClickListener(recyclerView) {    @Override    public void onItemClick(RecyclerView.ViewHolder viewHolder) {        ...    }    @Override    public void onItemLongClick(RecyclerView.ViewHolder viewHolder) {        ...                }});
原创粉丝点击