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

目录

背景

实现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.LinearLayoutCompatandroid: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.LinearLayoutCompatandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid: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"/><ImageViewandroid: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"/><TextViewandroid: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.LinearLayoutCompatandroid:layout_width="match_parent"android:layout_height="wrap_content"><androidx.appcompat.widget.LinearLayoutCompatandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:orientation="vertical"><TextViewandroid:id="@+id/black_item_address"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="2dp"android:textSize="15sp"android:text="中国-广东省-深圳市"/><TextViewandroid: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><Buttonandroid: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.RecyclerViewandroid: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@Overridepublic 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;}@Overridepublic 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());}@Overridepublic 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;@Overrideprotected 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);// 子控件1btn_black_del.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (onItemChildClickListener != null) {onItemChildClickListener.onItemChildClick(view, getAdapterPosition(), "chil_1");}}});// 子控件2iv_copy_ip.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (onItemChildClickListener != null) {onItemChildClickListener.onItemChildClick(view, getAdapterPosition(), "chil_2");}}});// item点击监听itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic 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;@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic void onItemClick(int position) {// item点击后执行...                }});}
}

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

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

相关文章

uniapp ios 授权弹窗 uniapp弹出框怎么实现

新版本的信息弹窗组件 可以弹出很多条信息&#xff0c;并单独控制消失时间、点击消失。 用循环来生成很多个弹窗&#xff0c;用this.$refs来传值&#xff0c;并添加数组。 1.布局 2.js 具体流程。需要一个弹窗&#xff0c;基本信息传入组件&#xff0c;处理后添加入数组&am…

Linux unset命令详解:如何删除已定义的 shell 变量(包括环境变量)和 shell 函数(附实例教程和注意事项)

Linux unset命令介绍 unset是一个内建于Linux的命令&#xff0c;用于在程序执行过程中删除变量&#xff08;包括环境变量&#xff09;或函数。unset命令可以删除函数和shell变量。如果指定了"varName"&#xff0c;它将指向一个变量名&#xff0c;shell将取消设置它并…

智能优化算法应用:基于闪电搜索算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于闪电搜索算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于闪电搜索算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.闪电搜索算法4.实验参数设定5.算法结果6.参考…

【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 )

文章目录 一、异常处理1、异常概念引入2、抛出异常语法3、捕获异常语法4、异常捕获流程 二、异常处理代码示例1、错误代码示例 - 抛出异常 / 不捕获异常2、正确代码示例 - 抛出异常 / 捕获异常3、正确代码示例 - 抛出异常 / 捕获异常不处理继续抛出异常 一、异常处理 1、异常概…

Java面向对象第8天

精华笔记&#xff1a; 接口&#xff1a; 是一种引用数据类型 由interface定义 只能包含常量和抽象方法 不能被实例化 接口是需要被实现/继承的&#xff0c;实现类/派生类&#xff1a;必须重写接口中的所有抽象方法 一个类可以实现多个接口&#xff0c;用逗号分隔。若又继承…

接口测试入门8问(含答案+文档)

Q1&#xff1a;什么是接口测试&#xff0c;基础知识什么的讲讲吧&#xff01; A&#xff1a;你好&#xff0c;接口可以分下面几种 1、系统与系统之间的调用&#xff0c;比如银行会提供接口供电子商务网站调用&#xff0c;或者说&#xff0c;支付宝会提供接口给淘宝调用 2、上…

Table和HashBasedTable的使用案例

------------------- 1.普通使用 package org.example.testhashbasedtable;import com.google.common.collect.HashBasedTable; import com.google.common.collect.Table;import java.util.Map;public class TestHashBasedTable {public static void main(String[] args) {Ta…

【方法】PowerPoint如何删除“限制编辑”?

如果PPT文件设置成“只读模式”&#xff0c;就会被限制编辑&#xff0c;也就是无法对PPT进行编辑或更改&#xff0c;那要如何删除这个“限制”呢&#xff1f; 下面小编会按照“无密码的只读方式”、“有密码的只读方式”以及“忘记了密码的只读方式”这3种情况&#xff0c;来说…

enote笔记法之附录2——5w1h2k关联词(ver0.22)

enote笔记法之附录2——5w1h2k关联词&#xff08;ver0.22&#xff09; 最上面的是截屏的完整版&#xff0c;分割线下面的是纯文字版本&#xff1a; 作者姓名&#xff08;本人的真实姓名&#xff09;&#xff1a;胡佳吉 居住地&#xff1a;上海 作者网名&#xff1a;EverSt…

【从删库到跑路 | MySQL总结篇】表的增删查改(进阶下)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、联合…

【接口技术】实验3:可编程并行接口8255

实验3 可编程并行接口8255实验 一、实验目的 1&#xff1a;了解8255芯片结构及编程方法。 2&#xff1a;了解8255输入/输出实验方法。 3&#xff1a;掌握8255控制键盘及显示电路的基本功能及编程方法。 4&#xff1a;掌握一般键盘和显示电路的工作原理。 二、实验内容 1&…

WS2812灯条基于WLED开源项目无门槛使用简介

WS2812灯条基于WLED开源项目无门槛使用简介 &#x1f4cc;项目github地址&#xff1a;https://github.com/Aircoookie/WLED&#x1f4cd;WLED详情地址&#xff1a;https://kno.wled.ge/&#x1f388;网页在线烧录固件地址&#xff1a;https://install.wled.me/ ✨ 仅作为使用的…

linux查询某个进程使用的内存量

linux查询某个进程使用的内存量 查进程用的内存&#xff0c;查看进程占用的内存量&#xff0c;centos查询内存使用 查某个进程id使用的内存量 ps -p 24450 -o rss | awk {print int($1/1024)"MB"} 该命令的含义是&#xff1a; ps -p 24450: 查找进程ID为24450的进…

Nginx漏洞复现与分析

Nginx如何处理PHP请求 Nginx本身不支持直接解析和执行PHP代码,但可以通过与PHP解释器的集成来处理PHP请求。一种常见的方法是使用PHP-FPM(FastCGI Process Manager)作为PHP解释器。 原理图: Step 1 Step 2 +---------------------+ …

安全技术与防火墙

目录 一、安全技术 1、安全技术 2、防火墙的分类 二、netfilter 1、netfilter简述 2、防火墙工具 1.iptables工具 2.netfilter的四表五链 3.内核中数据包的传输过程 4.三种报文流向 5.实操 总结&#xff1a;本章主要介绍了安全技术与防火墙 一、安全技术 1、安全技…

天拓四方分享:危化品企业如何搭建安全生产风险预警防控平台?

危化品企业作为高风险行业&#xff0c;其安全生产问题一直备受关注。为了有效预防和控制危化品企业在生产过程中可能出现的安全风险&#xff0c;提高企业的安全性和稳定性&#xff0c;搭建一套有效的安全生产风险预警防控平台势在必行&#xff0c;通过平台实现危化品生产、储存…

【C 语言经典100例】C 练习实例1

题目&#xff1a;有 1、2、3、4 四个数字&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;都是多少&#xff1f; 程序分析&#xff1a;可填在百位、十位、个位的数字都是 1、2、3、4&#xff0c;组成所有的排列后再去掉不满足条件的排列。 #include<std…

解决Unable to preventDefault inside passive event listener invocation.报错

报错信息&#xff1a; 这个报错大致说的是&#xff1a;无法在被动事件侦听器调用中防止Default 查了其他博主的解决办法&#xff1a;比如&#xff1a; 1、声明事件监听的时候设置为主动事件监听&#xff1a; window.addEventListener(‘touchmove’, handler, { passive: fal…

西南科技大学模拟电子技术实验一(常用电子仪器的使用及电子元器件的识别)预习报告

一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元 1、用万用表电阻挡测量实验板(箱)上电位器(可调电阻)的参数范围。 0~1kΩ电阻: 1k*0%=0 1k*100%=1k 所以范围为0~1k 0~10kΩ电阻: 10k*0%=0 10k*…

Javase | Java题目、Java算法题(不断添加中…)

目录: Java算法题1. 编写Java程序&#xff0c; 打印几个特定的ASCII码&#xff0c;包括数组0和9,大写字母A和Z ,小写字母a和z2.编写程序&#xff0c;对是哪个整型变量进行排序&#xff0c;按照从小到大的顺序排列3.用if语句的嵌套&#xff0c;根据学生成绩判断等级4.用switch语…