转载请注明出处,原文链接:https://blog.csdn.net/u013642500/article/details/80488425

【前言】

1、关于如何构建并使用RecyclerView,请参考:https://blog.csdn.net/u013642500/article/details/80480906

2、本文可以实现 GestureDetector 类的全部手势操作方法,包括 onSingleTapUp、onLongPress、onScroll、onFling、onShowPress、onDown、onDoubleTap、onDoubleTapEvent、onSingleTapConfirmed、onContextClick。

3、手势操作各个方法的含义,请参考:https://blog.csdn.net/u013642500/article/details/80489115

【构造自定义监听器】

1、新建 RecyclerItemClickListener 类,添加 RecyclerView.OnItemTouchListener 接口。

package com.test.myapplication;import android.support.v7.widget.RecyclerView;import android.view.MotionEvent;public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {    @Override    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {        return false;    }    @Override    public void onTouchEvent(RecyclerView rv, MotionEvent e) {    }    @Override    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {    }}

2、写四个全局变量:

    private OnItemClickListener mListener;    private GestureDetector mGestureDetector;    private View childView;    private RecyclerView touchView;

3、重写 onInterceptTouchEvent 方法:

    @Override    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {        touchView = rv;        childView = rv.findChildViewUnder(e.getX(), e.getY());        mGestureDetector.onTouchEvent(e);        return false;    }

4、写一个接口 OnItemClickListener(方法自定义,想写几个几个,看你的需求了):

    public interface OnItemClickListener {        void onItemClick(View view, int position);        void onLongClick(View view, int position);        void onScroll(View view, int position);    }

5、写构造函数,有两个参数:Context context 和 RecyclerItemClickListener.OnItemClickListener listener:

    public RecyclerItemClickListener(Context context, RecyclerItemClickListener.OnItemClickListener listener){    }

6、在构造函数中,实例化 GestureDetector 类对象:

    public RecyclerItemClickListener(Context context, RecyclerItemClickListener.OnItemClickListener listener){        mListener = listener;        mGestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener());    }

7、重写 GestureDetector.SimpleOnGestureListener 类的方法(需要几个写几个):

        mGestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){            @Override            public boolean onSingleTapUp(MotionEvent e) {                return super.onSingleTapUp(e);            }            @Override            public void onLongPress(MotionEvent e) {                super.onLongPress(e);            }            @Override            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {                return super.onScroll(e1, e2, distanceX, distanceY);            }        });

8、自定义接口与手势之间的“绑定”:

        mGestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){            @Override            public boolean onSingleTapUp(MotionEvent e) {                if (childView != null && mListener != null) {                    mListener.onItemClick(childView, touchView.getChildAdapterPosition(childView));                }                return true;            }            @Override            public void onLongPress(MotionEvent e) {                if (childView != null && mListener != null) {                    mListener.onLongClick(childView, touchView.getChildAdapterPosition(childView));                }            }            @Override            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {                if (childView != null && mListener != null) {                    mListener.onScroll(childView, touchView.getChildAdapterPosition(childView));                }                return true;            }        });

【使用自定义监听器】

在 MainActivity 中,给 RecyclerView 对象添加 item 触摸监听:

        recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {            @Override            public void onItemClick(View view, int position) {                Toast.makeText(getApplicationContext(), "点击了第" + position + "项", Toast.LENGTH_SHORT).show();            }            @Override            public void onLongClick(View view, int position) {                Toast.makeText(getApplicationContext(), "长按了第" + position + "项", Toast.LENGTH_SHORT).show();            }            @Override            public void onScroll(View view, int position) {                Toast.makeText(getApplicationContext(), "滑动了", Toast.LENGTH_SHORT).show();            }        }));

【成果】

【源代码】

RecyclerItemClickListener.java:

package com.test.myapplication;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.GestureDetector;import android.view.MotionEvent;import android.view.View;public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {    private OnItemClickListener mListener;    private GestureDetector mGestureDetector;    private View childView;    private RecyclerView touchView;    public RecyclerItemClickListener(Context context, RecyclerItemClickListener.OnItemClickListener listener){        mListener = listener;        mGestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){            @Override            public boolean onSingleTapUp(MotionEvent e) {                if (childView != null && mListener != null) {                    mListener.onItemClick(childView, touchView.getChildAdapterPosition(childView));                }                return true;            }            @Override            public void onLongPress(MotionEvent e) {                if (childView != null && mListener != null) {                    mListener.onLongClick(childView, touchView.getChildAdapterPosition(childView));                }            }            @Override            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {                if (childView != null && mListener != null) {                    mListener.onScroll(childView, touchView.getChildAdapterPosition(childView));                }                return true;            }        });    }    public interface OnItemClickListener {        void onItemClick(View view, int position);        void onLongClick(View view, int position);        void onScroll(View view, int position);    }    @Override    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {        touchView = rv;        childView = rv.findChildViewUnder(e.getX(), e.getY());        mGestureDetector.onTouchEvent(e);        return false;    }    @Override    public void onTouchEvent(RecyclerView rv, MotionEvent e) {    }    @Override    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {    }}

MainActivity.java:

package com.test.myapplication;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        List> mList = new ArrayList<>();        List tempList;        tempList = new ArrayList<>();        tempList.add("王一");        tempList.add("18");        mList.add(tempList);        tempList = new ArrayList<>();        tempList.add("赵二");        tempList.add("19");        mList.add(tempList);        tempList = new ArrayList<>();        tempList.add("李三");        tempList.add("16");        mList.add(tempList);        tempList = new ArrayList<>();        tempList.add("孙四");        tempList.add("20");        mList.add(tempList);        // 初始化 RecyclerView        RecyclerView recyclerView = findViewById(R.id.recyclerView);        // 实例化LinearLayoutManager对象        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);        // 设置 RecyclerView 布局为线性布局        recyclerView.setLayoutManager(linearLayoutManager);        // 实例化 Adapter        MyRecyclerView adapter = new MyRecyclerView(this, mList);        // 设置 Adapter        recyclerView.setAdapter(adapter);        recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {            @Override            public void onItemClick(View view, int position) {                Toast.makeText(getApplicationContext(), "点击了第" + position + "项", Toast.LENGTH_SHORT).show();            }            @Override            public void onLongClick(View view, int position) {                Toast.makeText(getApplicationContext(), "长按了第" + position + "项", Toast.LENGTH_SHORT).show();            }            @Override            public void onScroll(View view, int position) {                Toast.makeText(getApplicationContext(), "滑动了", Toast.LENGTH_SHORT).show();            }        }));    }}

由于本人安卓知识及技术有限,本文如有错误或不足请评论指出,非常感谢!

更多相关文章

  1. BroadcastReceiver注册的两种方法
  2. Android优化
  3. android开发之获取系统时间的方法
  4. Android之TextSwitcher详解
  5. RK3288 android7.1.2 插 UVCCamera 摄像头, android studio 调试9
  6. 代码流程分析二:Settings-蓝牙分析-搜索设备原理
  7. Android中Intent的几种使用方法
  8. android初中高开发工程师必需要装的一个APP
  9. android 按两次返回键退出程序

随机推荐

  1. 防止事件导致的oncreate的多次调用
  2. android开发学习资料
  3. Android之在Bitmap上涂鸦效果
  4. android 自定义 checkbox
  5. android 塔防游戏汇总 及android 游戏开
  6. 好的网子
  7. android 制作自定义标题栏
  8. android删除sd卡文件
  9. Android生命周期
  10. Android(安卓)使用SeekBar 变更屏幕亮度