博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义高效支持点击监听的RecyclerView
阅读量:6591 次
发布时间:2019-06-24

本文共 3693 字,大约阅读时间需要 12 分钟。

自定义高效支持点击监听的RecyclerView

效果图

这里写图片描述

Demo

地址:

传统做法

在Adapter内部直接对View添加点击事件

P

因为这种方式虽然也可以解决点击监听问题,但是效率不高,所以我就截了一张图,大家也就不要想着复制了,

话说我原来也是一直用这种方式,直到看到一篇文章:

性能上肯定是有一定提升,下面我对此进行了一下封装

封装

package kong.qingwei.recyclerviewitemclickdemo;import android.content.Context;import android.support.annotation.Nullable;import android.support.v4.view.GestureDetectorCompat;import android.support.v7.widget.RecyclerView;import android.util.AttributeSet;import android.view.GestureDetector;import android.view.MotionEvent;import android.view.View;/** * Created by kqw on 2016/5/18. * KqwRecyclerView * 支持点击监听的RecyclerView */public class KqwRecyclerView extends RecyclerView implements RecyclerView.OnItemTouchListener {
private GestureDetectorCompat mGestureDetector; private OnItemClickListener mOnItemClickListener; private OnItemLongClickListener mOnItemLongClickListener; public KqwRecyclerView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); initRecyclerView(); } private void initRecyclerView(){ mGestureDetector = new GestureDetectorCompat(getContext(), new ItemTouchHelperGestureListener()); addOnItemTouchListener(this); } @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { mGestureDetector.onTouchEvent(e); return false; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { mGestureDetector.onTouchEvent(e); } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } private class ItemTouchHelperGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override public boolean onSingleTapUp(MotionEvent e) { View child = findChildViewUnder(e.getX(), e.getY()); if (child != null) { RecyclerView.ViewHolder vh = getChildViewHolder(child); // 回调 if (mOnItemClickListener != null) { mOnItemClickListener.onItemClick(vh); } } return true; } @Override public void onLongPress(MotionEvent e) { View child = findChildViewUnder(e.getX(), e.getY()); if (child!=null) { RecyclerView.ViewHolder vh = getChildViewHolder(child); // 回调 if (mOnItemLongClickListener != null) { mOnItemLongClickListener.onItemLongClick(vh); } } } } public interface OnItemClickListener {
void onItemClick(ViewHolder v); } public interface OnItemLongClickListener {
boolean onItemLongClick(ViewHolder v); } public void setOnItemClickListener(@Nullable OnItemClickListener listener) { mOnItemClickListener = listener; } public void setOnItemLongClickListener(OnItemLongClickListener listener) { if (!isLongClickable()) { setLongClickable(true); } mOnItemLongClickListener = listener; }}

使用

使用和ListView一样

KqwRecyclerView recyclerView = (KqwRecyclerView) findViewById(R.id.recyclerView);……recyclerView.setOnItemClickListener(new KqwRecyclerView.OnItemClickListener() {    @Override    public void onItemClick(RecyclerView.ViewHolder v) {        Toast.makeText(getApplicationContext(), "onItemClick\n" + v.toString(), Toast.LENGTH_SHORT).show();    }});recyclerView.setOnItemLongClickListener(new KqwRecyclerView.OnItemLongClickListener() {    @Override    public boolean onItemLongClick(RecyclerView.ViewHolder v) {        Toast.makeText(getApplicationContext(), "onItemLongClick\n" + v.toString(), Toast.LENGTH_SHORT).show();        return false;    }});
你可能感兴趣的文章
ajax加载数据到页面无法打印的解决办法
查看>>
js 验证中文
查看>>
MySQL给查询结果添加一表表示行号或名次(1)
查看>>
Linux下运行java DES AES加解密
查看>>
DataNode 运行状况
查看>>
牛津词典 2018 年度词汇 ——「有毒」!
查看>>
XIB的是用
查看>>
Learning Data Structure_2_线性表、栈和队列
查看>>
驱动外置+原版安装方式『XLOS_Windows8_Pro_X86纯净版_V1.0』
查看>>
Android Arcface人脸识别sdk使用工具类
查看>>
android studio单个工程文件的代理设置
查看>>
Agent admitted failure to sign using the key
查看>>
grep 应用
查看>>
我的友情链接
查看>>
Linux实验室 CentOS关机大法
查看>>
一行命令获取当前JVM所有可设置的参数以及当前默认值
查看>>
spring与struts2 mvc共存web.xml简单配置
查看>>
Python web爬虫
查看>>
Python捕捉命令输出、错误输出及赋值命令到变量的方法
查看>>
js解析json
查看>>