【Android】从无到有:手把手一步步教你自定义RecyclerView手势监听
转载请注明出处,原文链接: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(); } })); }}
由于本人安卓知识及技术有限,本文如有错误或不足请评论指出,非常感谢!
更多相关文章
- BroadcastReceiver注册的两种方法
- Android优化
- android开发之获取系统时间的方法
- Android之TextSwitcher详解
- RK3288 android7.1.2 插 UVCCamera 摄像头, android studio 调试9
- 代码流程分析二:Settings-蓝牙分析-搜索设备原理
- Android中Intent的几种使用方法
- android初中高开发工程师必需要装的一个APP
- android 按两次返回键退出程序