Android RecyclerView Item点击事件

来源:互联网 发布:做淘宝联盟怎么样 编辑:程序博客网 时间:2024/05/17 05:24
RecyclerView控件出来后可以代替ListView,功能更强大,但是RecyclerView却没有ListView的setOnItemClickListener和setOnLongClickListener方法,这里仿照ListView实现其Item点击事件;
 第一步:RecyclerView为我们提供了OnItemTouchListener监听,所以写一个类实现RecyclerView.OnItemTouchListener,如:
 
 /** * Created by zyt on 2017/5/19. * 实现RecyclerView的点击监听 */public class ItemClickListener implements RecyclerView.OnItemTouchListener {    private GestureDetector mGestureDetector;    private OnItemClickListener mListener;    //内部接口,定义点击方法以及长按方法    public interface OnItemClickListener {        void onItemClick(View view, int position);        void onItemLongClick(View view, int position);    }    public ItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {        mListener = listener;        mGestureDetector = new GestureDetector(context,                new GestureDetector.SimpleOnGestureListener() { //这里选择SimpleOnGestureListener实现类,可以根据需要选择重写的方法                    //单击事件                    @Override                    public boolean onSingleTapUp(MotionEvent e) {                        View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());                        if (childView != null && mListener != null) {                            mListener.onItemClick(childView, recyclerView.getChildLayoutPosition(childView));                            return true;                        }                        return false;                    }                    //长按事件                    @Override                    public void onLongPress(MotionEvent e) {                        View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());                        if (childView != null && mListener != null) {                            mListener.onItemLongClick(childView, recyclerView.getChildLayoutPosition(childView));                        }                    }                });    }    @Override    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {        //把事件交给GestureDetector处理        if (mGestureDetector.onTouchEvent(e)) {            return true;        } else            return false;    }    @Override    public void onTouchEvent(RecyclerView rv, MotionEvent e) {    }    @Override    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {    }}第二步就是调用了:mRecyclerView.addOnItemTouchListener(new ItemClickListener(this, mRecyclerView, new ItemClickListener.OnItemClickListener() {@Overridepublic void onItemClick(View view, int position) {//这里就可以处理Item点击逻辑}@Overridepublic void onItemLongClick(View view, int position) {//这里就可以处理Item的长按逻辑}}));}


到这里就算结束了,以后使用就方便多了;
最后这里提下,使用RecyclerView时必须设置mRecyclerView.setLayoutManager();这个属性,否则数据是无法显示的,应用不会报错,可以运行但就是不显示数据,曾经找了三个多小时才找到这个问题。源码中有一句A LayoutManager must be provided for RecyclerView to function,可以看出setLayoutManager()必须设置的