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

简介: 自定义高效支持点击监听的RecyclerView效果图Demo地址:GitHub传统做法 在Adapter内部直接对View添加点击事件 ...

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

效果图

这里写图片描述

Demo

地址:GitHub

传统做法

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

P

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

话说我原来也是一直用这种方式,直到看到一篇文章:RecyclerView无法添加onItemClickListener最佳的高效解决方案

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

封装

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;
    }
});
相关文章
|
5月前
|
Java Android开发 UED
使用RecyclerView创建高效列表
使用RecyclerView创建高效列表
|
XML 程序员 Android开发
高级UI系列(一): 自定义UI理论篇(1)
自定义view是区分中级开发和初级开发的分水岭,虽说今年校招,工作三四年的老程序员一直在劝退客户端,作为职场打拼多年的老菜鸟,对android还是挺有信心的,虽说对view的知识也只是停留在纸上,很少真正落地做一些复杂高性能的ui控件,之前在akulaku确实见识了一群技术大牛,高级ui控件伸手就来,让我羡慕不已,这一次我也从基础到源码再到实战开始写几篇自定义view教程。大家有什么好的见解也欢迎到评论区多多交流。
171 0
高级UI系列(一): 自定义UI理论篇(1)
|
XML 存储 前端开发
高级UI系列(一): 自定义UI理论篇(2)
简介: 自定义view是区分中级开发和初级开发的分水岭,虽说今年校招,工作三四年的老程序员一直在劝退客户端,作为职场打拼多年的老菜鸟,对android还是挺有信心的,虽说对view的知识也只是停留在纸上,很少真正落地做一些复杂高性能的ui控件,之前在akulaku确实见识了一群技术大牛,高级ui控件伸手就来,让我羡慕不已,这一次我也从基础到源码再到实战开始写几篇自定义view教程。大家有什么好的见解也欢迎到评论区多多交流。
163 0
高级UI系列(一): 自定义UI理论篇(2)
|
小程序 索引 容器
如何使用滚动列表插件?
嗨!大家好,我是小蚂蚁。今天来分享一下小游戏制作工具中的滚动列表插件的使用方法。滚动列表在小游戏或者小程序中经常的会被用到,例如关卡选择列表,背包列表,信息展示列表等。滚动列表主要的作用是可以在一个有限的指定的范围内,展示大量的信息。
81 0
|
前端开发
bootstrap 组件之 输入框组 超大屏幕 列表组件学习总结
bootstrap 组件之 输入框组 超大屏幕 列表组件学习总结
|
存储 缓存 索引
更好的 RecyclerView 表项子控件点击监听器
上篇介绍了一种新的监听 RecyclerView 表项点击事件的方法。实现了将点击事件和RecyclerView.Adapter解耦。这一篇介绍如何监听 RecyclerView 表项子控件点击事件。
595 0
|
数据可视化 图形学 流计算
Unity 基础 之 代码动态监听UI交互组件汇总
通过介绍组件面板和代码示例,演示代码监听UI交互组件。
299 0
Unity 基础 之 代码动态监听UI交互组件汇总
|
存储 缓存 算法
更高效地刷新 RecyclerView | DiffUtil二次封装
每次数据变化都全量刷新整个列表是很奢侈的,不仅整个列表会闪烁一下,而且所有可见表项都会重新绑定一遍数据。这一篇对 DiffUtil 进行二次封装以让其更易于使用。
597 0
|
XML 存储 数据格式
如何使用RecyclerView优雅地实现复杂列表效
/ 今日科技快讯 / 发现一件很有意思的事情,今天这篇文章中介绍的RecyclerView,以及昨天文章中介绍的Lifecycles,它们共同的作者都是前天文章中介绍的Yigit Boyar大神。确实不是我有意为之,我都是按照投稿的顺序来安排推送的。而Yigit Boyar大神明天将会做客上海GDG,与大家进行一场问答式的技术活动。这种跟Google大神零距离接触的机会可不多,希望大家到时都能准时观看,我们明天见。/ 作者简介 /本篇文章来自秦川小将的投稿,给大家分享了如何使用RecyclerView实现复杂的列表,相信会对大家有所帮助!同时也感谢作者贡献的精彩文章! 秦川小将的博客地址:
如何使用RecyclerView优雅地实现复杂列表效
|
C#
艾伟:WPF中,如何将绑定源设置到单件实例
大概两个月前,曾有位朋友问我:如果我想在WPF中将绑定源设置到某个采用单件模式设计的实例上,应该怎么做呢?这是一个不错的问题.可能这段时间比较忙,呵呵,忘记回答这个问题了,昨天拿到伍迷大哥的《大话设计模式》(PS:强烈推荐该书哈,真的不错)时突然想起这个问题了.
1000 0

相关实验场景

更多