android v7兼容包RecyclerView的使用(四)——点击事件的不同方式处理
前三篇文章
android v7兼容包RecyclerView的使用(三)——布局管理器的使用
android v7兼容包RecyclerView的使用(二)
android v7兼容包RecyclerView的使用(一)
介绍了RecyclerView的使用以及常见的相关类和布局管理器的灵活之处。写了这么多篇,还没涉及到用户交互,那么怎么处理点击事件呢。
在RecyclerView中你会惊奇的发现,该类中并没有OnItemClickListener监听器监听我们的单击事件,也没有OnItemLongClickListener监听器监听我们的长按事件。取而代之的是OnItemTouchListener监听器,那么该怎样实现我们的点击事件和长按事件呢。
我们的代码是基于上篇文章布局管理器的代码,在其基础上加入事件监听。
假设让我们自己来事件点击事件,我们比方会使用ViewHolder来间接处理事件。首先在适配器中添加监听器接口。
interface OnItemClickListener {
void onClick(View v);
}
interface OnItemLongClickListener {
void onLongClick(View v);
}
private OnItemClickListener onClickListener;
private OnItemLongClickListener onLongClickListener;
然后重载构造函数,使其能够接收监听器实例
public CardViewAdapter(String[] data) {
this(data, null, null);
}
public CardViewAdapter(String[] data, OnItemClickListener onClickListener) {
this(data, onClickListener, null);
}
public CardViewAdapter(String[] data, OnItemClickListener onClickListener,
OnItemLongClickListener onLongClickListener) {
this.data = data;
this.onClickListener = onClickListener;
this.onLongClickListener = onLongClickListener;
}
终于会调用三參数的构造器,在该构造器内完毕赋值。
将原来的ViewHolder构造函数进行改造,使其处理点击事件,当然也能够直接在onCreateViewHolder函数里处理点击事件。
public ViewHolder(View itemLayoutView,
final OnItemClickListener onClickListener,
final OnItemLongClickListener onLongClickListener) {
super(itemLayoutView);
info = (TextView) itemLayoutView.findViewById(R.id.info_text);
itemLayoutView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//在监听器不为空的时候,进行回调
if (onClickListener != null) {
onClickListener.onClick(v);
}
}
});
itemLayoutView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
//在监听器不为空的时候,进行回调
if (onLongClickListener != null) {
onLongClickListener.onLongClick(v);
}
//返回true,消费掉该事件,阻止其继续传递
return true;
}
});
}
细致一看,事实上代码还是挺多的,那么让我们调用一下。
mAdapter = new CardViewAdapter(data,new OnItemClickListener() {
@Override
public void onClick(View v) {
TextView info = (TextView) v.findViewById(R.id.info_text);
Toast.makeText(getApplicationContext(), "单击"+info.getText(), Toast.LENGTH_LONG).show();
}
},new OnItemLongClickListener() {
@Override
public void onLongClick(View v) {
TextView info = (TextView) v.findViewById(R.id.info_text);
Toast.makeText(getApplicationContext(), "长按"+info.getText(), Toast.LENGTH_LONG).show();
}
});
后面两个參数能够传空值,代表不设置监听器。
执行效果图例如以下。
我们会发现,上面的代码耦合性还是有点高,事件直接与适配器发生了耦合,除此之外,我们还应该有更好的方法来处理这个点击事件。是的,不是有OnItemTouchListener监听器吗,再配合手势不就能够吗。
好了,看代码吧,详解在凝视中。
package cn.edu.zafu.layoutmanager;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
/**
* 监听器,实现OnItemTouchListener接口
*
* @author lizhangqu
*
* 2015-3-12
*/
public class RecyclerItemClickListener implements
RecyclerView.OnItemTouchListener {
private OnItemClickListener mListener;
private GestureDetector mGestureDetector;
// 点击回调
public interface OnItemClickListener {
public void onItemClick(View view, int position);
public void onItemLongClick(View view, int position);
}
public RecyclerItemClickListener(Context context,
final RecyclerView recyclerView, OnItemClickListener listener) {
mListener = listener;
// 识别并处理手势
mGestureDetector = new GestureDetector(context,
new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
// 轻击触摸屏后,弹起,必须返回true,否则无法触发单击
return true;
}
@Override
public void onLongPress(MotionEvent e) {
// 长按
// 依据findChildViewUnder(float x, float y)来算出哪个item被选择了
View childView = recyclerView.findChildViewUnder(
e.getX(), e.getY());
// 有item被选则且监听器不为空触发长按事件
if (childView != null && mListener != null) {
mListener.onItemLongClick(childView,
recyclerView.getChildPosition(childView));
}
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
View childView = view.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null
&& mGestureDetector.onTouchEvent(e)) {
// 触发单击事件
mListener.onItemClick(childView, view.getChildPosition(childView));
return true;
}
return false;
}
@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}
}
在activity中调用
mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getApplicationContext(), mRecyclerView, new OnItemClickListener() {
@Override
public void onItemLongClick(View view, int position) {
Toast.makeText(getApplicationContext(), "长按"+data[position], Toast.LENGTH_SHORT).show();
}
@Override
public void onItemClick(View view, int position) {
Toast.makeText(getApplicationContext(), "短按"+data[position], Toast.LENGTH_SHORT).show();
}
}));
非常明显,另外一种方式与适配器进行了解耦。应该说优于第一种方法。
那么还有没有方法处理点击事件呢。让我们从万能的github上搜索一下。
https://github.com/lucasr/twoway-view
在该项目的sample文件夹下有个类里面有这样一段代码
final ItemClickSupport itemClick = ItemClickSupport.addTo(mRecyclerView);
itemClick.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(RecyclerView parent, View child, int position, long id) {
mToast.setText("Item clicked: " + position);
mToast.show();
}
});
itemClick.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(RecyclerView parent, View child, int position, long id) {
mToast.setText("Item long pressed: " + position);
mToast.show();
return true;
}
});
上述代码有个ItemClickSupport 类,对的,该类就是提供事件的支持。那么该类在哪里呢,事实上它在该项目的core文件夹下。我直接将其该文件夹下的代码拷至我的项目的包中,删除一个不相关的类,就直接使用了,当然还须要拷一个资源文件就是ids.xml
实际执行效果呢,是跟上面两种方式是一样的,那么它的实现由什么差别呢,事实上与另外一种方式没什么大的差别,基本上就是OnItemTouchListener 加手势实现的,仅仅只是其逻辑可能更加严谨,设计更加优秀罢了。除此之外,该文件夹下另一个ItemSelectionSupport类,该类提供了item选择的功能,提供了单选多选方式,然而呢,在我測试时发现存在bug,所以呢,这个类的使用就跳过了。
至此,RecyclerView的点击事件就处理完了。
android v7兼容包RecyclerView的使用(四)——点击事件的不同方式处理的更多相关文章
- android v4兼容包
一句话解释android兼容包就是:支持更多的组件,样式更好看了.好粗糙的解释啊! 我们都知道Android一些SDK比较分裂,为此google官方提供了Android Support Library ...
- 转:android Support 兼容包详解
本文转自stormzhang的ANDROID SUPPORT兼容包详解 背景 来自于知乎上邀请回答的一个问题Android中AppCompat和Holo的一个问题?, 看来很多人还是对这些兼容包搞不清 ...
- android中RecyclerView控件实现点击事件
RecyclerView控件实现点击事件跟ListView控件不同,并没有提供类似setOnItemClickListener()这样的注册监听器方法,而是需要自己给子项具体的注册点击事件. 本文的例 ...
- 为RecyclerView添加item的点击事件
RecyclerView侧重的是布局的灵活性,虽说可以替代ListView但是连基本的点击事件都没有,这篇文章就来详细讲解如何为RecyclerView的item添加点击事件,顺便复习一下观察者模式. ...
- android学习之4种点击事件的响应方式
如题,下面就一一列出对点击事件响应的4种方式: 第一种:内部类的形式: package com.example.dail; import android.net.Uri; import android ...
- Android中点击事件的实现方式
在之前博文中多次使用了点击事件的处理实现,有朋友就问了,发现了很多按钮的点击实现,但有很多博文中使用的实现方式有都不一样,到底是怎么回事.今天我们就汇总一下点击事件的实现方式. 点击事件的实现大致分为 ...
- 33、Android Support兼容包详解(转载)
原文转自:微信分享 2015-03-31 22:11 背景 来自于知乎上邀请回答的一个问题Android中AppCompat和Holo的一个问题?, 看来很多人还是对这些兼容包搞不清楚,那么干脆写篇博 ...
- Android MultiDex兼容包怎么使用?
在Android系统中安装应用的时候,需要对Dex进行优化,但由于其处理工具DexOpt的限制,导致其id的数目不能够超过65536个.而MultiDex兼容包的出现,就很好的解决了这个问题,它可以配 ...
- Android Emoji兼容包使用详解
Emoji兼容性 我们经常会遇到这样的问题: 给朋友发的emoji表情, 在自己手机上展示是正常的, 但是到朋友手机上, 却没有展示出来, 或者展示出来了, 但是也跟自己手机上展示的不一样. 所以, ...
随机推荐
- (step 8.2.13)hdu 1524(A Chess Game)
题目大意 : 在一个 有向无环图顶点上面有几个棋子, 2个人轮流操作, 每次操作就是找一个棋子往它能够移 动的地方移动一格, 不能操作的人输. 输入第一行 为一个 N , 表示有 N 个顶点 0 -& ...
- webapi Task
webapi+Task并行请求不同接口实例 标题的名称定义不知道是否准确,不过我想表达的意思就是使用Task特性来同时请求多个不同的接口,然后合并数据:我想这种场景的开发对于对接过其他公司接口的人不会 ...
- configure: error: zlib not installed
export LDFLAGS="-L/usr/local/zlib/lib" export CPPFLAGS="-I/usr/local/zlib/include&quo ...
- BytesWritable 存储问题
public static void main(String args[]){ BytesWritable cv = new BytesWritable(); String str1 = " ...
- MapReduce 异常 LongWritable cannot be cast to Text
有一个txt文件,内容格公式是这样的: 深圳订做T恤 5729944 深圳厂家t恤批发 5729945 深圳定做文化衫 5729944 文化衫厂家 5729944 订做文化衫 5729944 深圳t恤 ...
- Net分布式系统
Net分布式系统 Net分布式系统之三:Keepalived+LVS+Nginx负载均衡之高可用 摘要: 上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡, ...
- Cracking the coding interview--问题与解答
http://www.hawstein.com/posts/ctci-solutions-contents.html 作者:Hawstein出处:http://hawstein.com/posts/c ...
- Apache James使用的方法及相关心得(转)
经过一番的辛苦努力,终于把James 配置搞定啦,好记性不如烂笔头啊,赶紧记下我的成功经过,以备以后查阅! 首先要做的就是配置域名的MX 记录啦: 先添加一条A记录: mail.abc.com 指向 ...
- cocos2d-html5游戏图片资源选择
cocos2d-html5游戏图片资源能够选择,单张的图片作为一个精灵或者场景的载入对象.也能够把图片给做成plist文件.通过plist来訪问图片资源.其中优缺点.使用方式在个人的測试其中体现例如以 ...
- Visual Studio跨平台开发实战(2) - Xamarin.iOS基本控制项介绍
原文 Visual Studio跨平台开发实战(2) - Xamarin.iOS基本控制项介绍 前言 在上一篇文章中, 我们介绍了Xamarin 以及简单的HelloWorld范例, 这次我们针对iO ...