转载请注明出处,原文链接: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<List<String>> mList = new ArrayList<>();
List<String> 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();
}
}));
}
}
由于本人安卓知识及技术有限,本文如有错误或不足请评论指出,非常感谢!