android 手势监听不到,【Android】从无到有:手把手一步步教你自定义RecyclerView手势监听...

【前言】

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

【构造自定义监听器】

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();

}

}));

【成果】

bd3deea674dea269d175da8aaf701045.gif

【源代码】

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();

}

}));

}

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值