您的位置:首页 > 移动开发 > Android开发

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

2018-01-04 00:00 696 查看


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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐