zoukankan      html  css  js  c++  java
  • Android RecyclerView单击、长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类

    

    Android RecyclerView单击、长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类


    我写的附录文章2,介绍了Android如何基于OnItemTouchListener +GestureDetector实现单击、长按事件的监听,由于如今RecyclerView在Android开发是如此的普遍,以及RecyclerView的单击事件是如此的常用,如果像附录文章2那样把一堆事件监听写到业务逻辑代码里面,那得写多少遍重复代码!所以我把给RecyclerView添加点击事件的Listener抽取、封装成一个常用的工具栏类RecyclerViewUtil。
    在给一个RecyclerView添加单击事件时候,跟ListView的监听事件一样,只需要简单的写如下代码即可完成:

    //第一步,先初始化RecyclerViewUtil,传入当前的RecyclerView对象和上下文指针this:Context
            RecyclerViewUtil util=new RecyclerViewUtil(this,mRecyclerView);
    
            //第二步,直接set
            util.setOnItemClickListener(new RecyclerViewUtil.OnItemClickListener() {
                @Override
                public void onItemClick(int position, View view) {
                    //Toast.makeText(getApplicationContext(),position+" 单击",Toast.LENGTH_SHORT).show();
                }
            });


    长按事件也类似:

    //先初始化RecyclerViewUtil,传入当前的RecyclerView对象和上下文指针this:Context
            RecyclerViewUtil util=new RecyclerViewUtil(this,mRecyclerView);
    
            util.setOnItemLongClickListener(new RecyclerViewUtil.OnItemLongClickListener() {
                @Override
                public void onItemLongClick(int position, View view) {
                    //Toast.makeText(getApplicationContext(),position+" 长按",Toast.LENGTH_SHORT).show();
                }
            });


    封装、抽取好的通用RecyclerViewUtil.java全部代码:

    package zhangphil.app;
    
    import android.content.Context;
    import android.support.v7.widget.RecyclerView;
    import android.view.GestureDetector;
    import android.view.MotionEvent;
    import android.view.View;
    
    
    /**
     * Created by Phil on 2016/11/19.
     */
    
    public class RecyclerViewUtil {
        private RecyclerView mRecyclerView = null;
        private GestureDetector mGestureDetector = null;
        private RecyclerView.SimpleOnItemTouchListener mSimpleOnItemTouchListener;
        private OnItemClickListener mOnItemClickListener = null;
        private OnItemLongClickListener mOnItemLongClickListener = null;
        private Context context;
    
        public RecyclerViewUtil(Context context, RecyclerView recyclerView) {
            this.context = context;
            this.mRecyclerView = recyclerView;
    
            mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
                //长按事件
                @Override
                public void onLongPress(MotionEvent e) {
                    super.onLongPress(e);
                    if (mOnItemLongClickListener != null) {
                        View childView = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
                        if (childView != null) {
                            int position = mRecyclerView.getChildLayoutPosition(childView);
                            mOnItemLongClickListener.onItemLongClick(position, childView);
                        }
                    }
                }
    
                //单击事件
                @Override
                public boolean onSingleTapUp(MotionEvent e) {
                    if (mOnItemClickListener != null) {
                        View childView = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
                        if (childView != null) {
                            int position = mRecyclerView.getChildLayoutPosition(childView);
                            mOnItemClickListener.onItemClick(position, childView);
                            return true;
                        }
                    }
    
                    return super.onSingleTapUp(e);
                }
            });
    
            mSimpleOnItemTouchListener = new RecyclerView.SimpleOnItemTouchListener() {
                @Override
                public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
                    if (mGestureDetector.onTouchEvent(e)) {
                        return true;
                    }
                    return false;
                }
            };
    
            mRecyclerView.addOnItemTouchListener(mSimpleOnItemTouchListener);
        }
    
        public void setOnItemClickListener(OnItemClickListener l) {
            mOnItemClickListener = l;
        }
    
        public void setOnItemLongClickListener(OnItemLongClickListener l) {
            mOnItemLongClickListener = l;
        }
    
        //长按事件接口
        public interface OnItemLongClickListener {
            public void onItemLongClick(int position, View view);
        }
    
        //单击事件接口
        public interface OnItemClickListener {
            public void onItemClick(int position, View view);
        }
    }


    使用时候直接把RecyclerViewUtil.java复制到自己的项目代码工程中即可。


    附录:
    1,《RecyclerView点击事件》链接:http://blog.csdn.net/zhangphil/article/details/46771865
    2,《Android RecyclerView单击、长按事件标准实现:基于OnItemTouchListener + GestureDetector》:http://blog.csdn.net/zhangphil/article/details/53230157

  • 相关阅读:
    K-Means++ 聚类之数据可视化:使用gnuplot
    QQ设计第1-5步
    QQ设计第1-5步
    为什么有很深的windows基础还是不能动摇linux半步
    常用命令
    在线会计_金蝶友商网
    XP使用VNC远程桌面CentOS 6
    Fatal error: Call to undefined function mb_substr()
    如何汉化 po 文件及编译成 mo 文件
    idoerp
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6147236.html
Copyright © 2011-2022 走看看