Android中实现RecyclerView,并对item及其多个子控件的点击事件监听

news2024/11/19 5:39:41

目录

背景

实现RecyclerView

第一步、 新建item的xml

第二步、在activity的布局中引入 RecyclerView

第三步、新建一个adapter 

 第四步、在activity中初始化绑定adapter即可

实现item及其多个子组件点击事件监听

第一步、 适配器中创建监听对象

第二步、适配器中绑定监听item和子组件

第三点、在activity中实现方法


背景

如下图所示,在对RecyclerView中item及其多个子组件都需要不同的点击事件监听处理,需要使用到adapter的OnItemClickListener和OnItemChildClickListener两个对象。

实现RecyclerView

第一步、 新建item的xml

新建一个xml文件(black_item.xml)作为单个item的样式,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp">
    
    <androidx.appcompat.widget.LinearLayoutCompat
        android:id="@+id/lc_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center_vertical"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="5dp"
        tools:ignore="MissingConstraints">

        <androidx.appcompat.widget.LinearLayoutCompat
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/black_item_ip"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="18sp"
                android:textStyle="bold"
                android:text="180.123.121.118"/>

            <ImageView
                android:id="@+id/iv_copy_ip"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:src="@drawable/baseline_content_copy_24"/>

            <TextView
                android:id="@+id/black_item_time"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="right"
                android:textSize="12sp"
                android:textColor="@color/notice_item_time"
                android:text="2023-11-06 12:10:11"/>


        </androidx.appcompat.widget.LinearLayoutCompat>

        <androidx.appcompat.widget.LinearLayoutCompat
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <androidx.appcompat.widget.LinearLayoutCompat
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/black_item_address"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:textSize="15sp"
                    android:text="中国-广东省-深圳市"/>

                <TextView
                    android:id="@+id/black_item_note"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:layout_marginBottom="2dp"
                    android:textSize="12sp"
                    android:textColor="@color/notice_item_time"
                    android:text="备注:"/>

            </androidx.appcompat.widget.LinearLayoutCompat>

            <Button
                android:id="@+id/btn_black_del"
                android:layout_width="wrap_content"
                android:layout_height="30sp"
                android:background="@drawable/btn_black_del"
                android:layout_gravity="center_vertical"
                android:textColor="@color/white"
                android:text="删除"/>

        </androidx.appcompat.widget.LinearLayoutCompat>

    </androidx.appcompat.widget.LinearLayoutCompat>


</androidx.appcompat.widget.LinearLayoutCompat>

 样式效果如下图:

第二步、在activity的布局中引入 RecyclerView

<androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/rv_black"
                    tools:listitem="@layout/black_item"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" />

第三步、新建一个adapter 

用于相应数据和功能配置,代码如下:

public class BlackRVAdapter extends RecyclerView.Adapter<BlackRVAdapter.MyHolder> {

    private List<BlackItem> myBlackList = new ArrayList<>();

    public void setListData (List<BlackItem> list) {
        this.myBlackList = list;
        notifyDataSetChanged(); // 刷新
    }

    @NonNull
    @Override
    public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        // 加载布局
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.black_item, parent, false);
        MyHolder myHolder = new MyHolder(view);

        return myHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull MyHolder holder, @SuppressLint("RecyclerView") int position) {
        // 绑定数据
        BlackItem BlackItem = myBlackList.get(position);

        // 修改item样式
        holder.black_address.setText(BlackItem.getIp_address());
        holder.black_note.setText("备注:" + BlackItem.getNote());
        holder.black_time.setText(BlackItem.getCreated_time());
        holder.black_ip.setText(BlackItem.getIp());
    }

    @Override
    public int getItemCount() {
        return myBlackList.size();
    }

    static class MyHolder extends RecyclerView.ViewHolder {
        
        TextView black_address;
        TextView black_note;
        TextView black_time;
        TextView black_ip;
        ImageView iv_copy_ip;
        Button btn_black_del;

        public MyHolder(@NonNull View itemView) {
            super(itemView);

            black_time = itemView.findViewById(R.id.black_item_time);
            black_ip = itemView.findViewById(R.id.black_item_ip);
            black_address = itemView.findViewById(R.id.black_item_address);
            black_note = itemView.findViewById(R.id.black_item_note);
            iv_copy_ip = itemView.findViewById(R.id.iv_copy_ip);
            btn_black_del = itemView.findViewById(R.id.btn_black_del);
        }
    }
}

 第四步、在activity中初始化绑定adapter即可

public class IpBlackListActivity extends AppCompatActivity {

    private RecyclerView blackRecyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ip_black_list);

        initView();
  
    }

    private void initView () {

        blackRecyclerView = findViewById(R.id.rv_black);

        // 绑定适配器
        blackRVAdapter = new BlackRVAdapter();
        blackRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        blackRecyclerView.setAdapter(blackRVAdapter);
        blackRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL)); // 添加下划线
       
    }
}

实现item及其多个子组件点击事件监听

第一步、 适配器中创建监听对象

public class BlackRVAdapter extends RecyclerView.Adapter<BlackRVAdapter.MyHolder> {

    private static OnItemChildClickListener onItemChildClickListener;
    private static OnItemClickListener onItemClickListener;

   
    public interface OnItemChildClickListener {
        /**
         * 子组件点击事件
         * @param view
         * @param position
         * @param type 子组件类型,用于判断是哪个子组件
         */
        void onItemChildClick(View view, int position, String type);
    }

    public void setOnItemClickListener(OnItemChildClickListener listenser) {
        onItemChildClickListener = listenser;
    }

    public interface OnItemClickListener {
        void onItemClick(int position);
    }

    public void setOnItemClickListener(OnItemClickListener listenser) {
        onItemClickListener = listenser;
    }

}

第二步、适配器中绑定监听item和子组件

public class BlackRVAdapter extends RecyclerView.Adapter<BlackRVAdapter.MyHolder> {

    private static OnItemChildClickListener onItemChildClickListener;
    private static OnItemClickListener onItemClickListener;

    static class MyHolder extends RecyclerView.ViewHolder {
        public MyHolder(@NonNull View itemView) {
            super(itemView);
            
            // 绑定子控件
            iv_copy_ip = itemView.findViewById(R.id.iv_copy_ip);
            btn_black_del = itemView.findViewById(R.id.btn_black_del);

            // 子控件1
            btn_black_del.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (onItemChildClickListener != null) {
                        onItemChildClickListener.onItemChildClick(view, getAdapterPosition(), "chil_1");
                    }
                }
            });

            // 子控件2
            iv_copy_ip.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (onItemChildClickListener != null) {
                        onItemChildClickListener.onItemChildClick(view, getAdapterPosition(), "chil_2");
                    }
                }
            });

            // item点击监听
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (onItemClickListener != null) {
                        onItemClickListener.onItemClick(getAdapterPosition());
                    }
                }
            });
        }
    }

    public interface OnItemChildClickListener {
        /**
         * 子组件点击事件
         * @param view
         * @param position
         * @param type 子组件类型,用于判断是哪个子组件
         */
        void onItemChildClick(View view, int position, String type);
    }

    public void setOnItemClickListener(OnItemChildClickListener listenser) {
        onItemChildClickListener = listenser;
    }

    public interface OnItemClickListener {
        void onItemClick(int position);
    }

    public void setOnItemClickListener(OnItemClickListener listenser) {
        onItemClickListener = listenser;
    }

}

第三点、在activity中实现方法

public class IpBlackListActivity extends AppCompatActivity {

    private RecyclerView blackRecyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ip_black_list);

        initView();
  
    }

    private void initView () {

        blackRecyclerView = findViewById(R.id.rv_black);

        // 绑定适配器
        blackRVAdapter = new BlackRVAdapter();
        blackRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        blackRecyclerView.setAdapter(blackRVAdapter);
        blackRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL)); // 添加下划线

        // 子组件点击事件
        blackRVAdapter.setOnItemClickListener(new BlackRVAdapter.OnItemChildClickListener() {
            @Override
            public void onItemChildClick(View view, int position, String type) {
                if (type.equals("chil_1")) {
                    // 子组件1点击后执行...
                    
                } else if (type.equals("chil_2") {
                    // 子组件2点击后执行...
                    
                }
            }
        }
        
        // item点击事件
        blackRVAdapter.setOnItemClickListener(new BlackRVAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                // item点击后执行...                

            }
        });
       
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1269953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Git】ssh: connect to host github.com port 22: Connection refused

错误展示&#xff1a; 错误原因&#xff1a;22端口被拒绝访问 解决办法 在~/.ssh/config文件&#xff08;有就直接编辑&#xff0c;没有就创建&#xff09;里添加以下内容&#xff0c;这样ssh连接GitHub的时候就会使用443端口。 Host github.comHostname ssh.github.comPort…

mac 聚焦搜索不显示

我是连搜索框都不显示&#xff0c;不是搜索结果显示异常 点右上角的搜索按钮都毫无反应 我检查过快捷键之类的设置&#xff0c;都正常&#xff0c;最后是通过删除文件解决的 cd ~/Library/Preferences/ rm com.apple.Spotlight.plist 重启 mac 参考 Spotlight Search Not W…

串口理解小结(UART)

串口作为单片机的必备外设&#xff0c;主要用于单片机与其它模块的信息通讯、程序烧录和升级作用。 UART全称为通用异步收发器。 可分为&#xff1a; 一、串行和并行 串行指数据位只能一位一位地发送 并行之多个数据位同时发送 二、同步和异步 同步和异步是相当于时钟而…

linux 服务 下 redis 安装和 启动

官网下载 https://redis.io/download/ 安装步骤&#xff1a; 1.安装redis 所需要的依赖 yum install -y gcc tcl2.上传安装包并解压&#xff0c;下载安装包&#xff0c;上传到/usr/local/src目录&#xff0c;解压 tar -zxvf redis-7.2.3.tat.gz进入安装目录&#xff0c;运行…

基于Java SSM框架实现美食推荐管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现美食推荐管理系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&a…

zookeeper 客户端常用命令简单记录(实操课程系列--watcher功能测试)(发布订阅功能测试)

本系列是zookeeper相关的实操课程&#xff0c;课程测试环环相扣&#xff0c;请按照顺序阅读测试来学习zookeeper。阅读本文之前&#xff0c;请先阅读----zookeeper 单机伪集群搭建简单记录&#xff08;实操课程系列&#xff09; 1、命令行工具切换到zookeeper的bin目录下面&am…

【计算机网络笔记】交换机

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

Java零基础——docker篇

1.【熟悉】docker简介 1.1 什么是docker Docker是一个开源项目&#xff0c;诞生于2013年初&#xff0c;最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会&#xff0c;遵从了Apache2.0协议&#xff0c;项目代码在GitHub上进…

【开源视频联动物联网平台】流媒体传输协议HLS,FLV的功能和特点

HLS&#xff08;HTTP Live Streaming&#xff09;和FLV&#xff08;Flash Video&#xff09;都是用于视频流传输的协议或容器格式&#xff0c;但它们在某些方面有着显著的区别和特点。 HLS是一种由苹果公司开发的用于流媒体传输的协议&#xff0c;而FLV则是Adobe公司开发的用于…

【排序】希尔排序(C语言实现)

文章目录 前言1. 希尔排序的思想2. 希尔排序的一些小优化 前言 本章将详细介绍希尔排序的思想及实现&#xff0c;由于希尔排序是在插入排序的思想上进行升华&#xff0c;所以如果不知道插入排序或者不熟悉的可以先看看这篇文章&#xff1a;《简单排序》中的直接插入排序。 1. 希…

AppDelete 4.3.3(软件清理卸载工具)

AppDelete for Mac是一款运行在Mac平台上的强大软件卸载工具&#xff0c;AppDelete Mac版不仅可以删除应用程序&#xff0c;还可以删除小部件&#xff0c;首选项窗格&#xff0c;插件和屏幕保护程序及其相关文件&#xff0c;卸载快速又干净&#xff0c;仅需要简单的拖拽即可。 …

国内首个农业开源鸿蒙操作系统联合华为正式发布

2023年11月29日&#xff0c;在中国国际供应链促进博览会上&#xff0c;中信农业科技股份有限公司&#xff08;简称“中信农业”&#xff09;与深圳开鸿数字产业发展有限公司&#xff08;简称“深开鸿”&#xff09;以及华为技术有限公司&#xff08;简称“华为”&#xff09;联…

智能手表上的音频(四):语音通话

上篇讲了智能手表上音频文件播放。本篇开始讲语音通话。同音频播放一样有两种case&#xff1a;内置codec和BT。先看这两种case下audio data path&#xff0c;分别如下图&#xff1a; 内置codec下的语音通话audio data path 蓝牙下的语音通话audio data path 从上面两张图可以看…

函数保留凸性的一些运算,限制为一条线

凸优化在学术研究中非常重要&#xff0c;经常遇到的问题是证明凸性。常规证明凸性的方式是二阶导数的黑塞矩阵为半正定&#xff0c;或者在一维函数时二阶导数大于等于零。但很多时候的数学模型并不那么常规、容易求导的&#xff0c;若能够知道一些保留凸性的运算&#xff0c;将…

亚马逊云科技基于 Polygon 推出首款 Amazon Managed Blockchain Access,助 Web3 开发人员降低区块链节点运行成本

2023 年 11 月 26 日&#xff0c;亚马逊 (Amazon) 旗下 Amazon Web Services&#xff08;Amazon&#xff09;在其官方博客上宣布&#xff0c;Amazon Managed Blockchain (AMB) Access 已支持 Polygon Proof-of-Stake(POS) 网络&#xff0c;并将满足各种场景的需求&#xff0c;包…

ffmpeg 把mp4文件中某段视频转成gif文件

一 缘起背景&#xff1a; 有视频文件转gif动图的需求&#xff1b;网上下载的转换工具需要注册会员、否则带水印&#xff0c;还限制时长。 二 工具环境&#xff1a; win10 下 dos 操作 ffmpeg 三 操作命令&#xff1a; ffmpeg -i test.mp4 -ss 00:01:01 -t 00:00:19 -vf &q…

pytorch环境下安装node2vec

1.刚开始直接pip install 出错 看到是在安gensim时候出错 2.单独安gensim&#xff1a;https://www.lfd.uci.edu/~gohlke/pythonlibs/ 找到合适的版本&#xff0c;cp36就是python3.6&#xff0c;下载以后放在 3.

MySQL之MVCC原理详解

MySQL之MVCC&#xff08;多版本并发控制&#xff09; 谈谈数据库隔离级别 谈起MVCC&#xff0c;就不得不说到事务隔离级别&#xff0c;因为MVCC是为了实现数据库的隔离级别&#xff0c;保证事务并发的情况下数据安全的同时还能保持高性能的方式。 在事务并发的场景下会引起脏…

Node.js 万字教程

0. 基础概念 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;使用了一个事件驱动、非阻塞式 I/O 模型&#xff0c;让 JavaScript 运行在服务端的开发平台。 官方地址&#xff1a;https://nodejs.org/en 中文地址&#xff1a;https://nodejs.org/zh-cn 代…

连接备份1128

深度学习—分类识别篇&#xff1a;http://tr.daheng-imaging.com/watch/1050636http://tr.daheng-imaging.com/watch/1050636 深度学习—目标检测篇&#xff1a;http://tr.daheng-imaging.com/watch/1101141http://tr.daheng-imaging.com/watch/1101141 深度学习—缺陷分割篇&a…