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.rhkb.cn/news/206848.html

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

相关文章

搭建测试平台开发(一):Django基本配置与项目创建

一、安装Django最新版本 1 pip install django二、创建Django项目 首先进入要存放项目的目录&#xff0c;再执行创建项目的命令 1 django-admin startproject testplatform三、Django项目目录详解 1 testplatform 2 ├── testplatform  # 项目的容器 3 │ ├── …

提升技能素养,AMCAP做出合适的决策

近年来&#xff0c;智能配置投资与理财逐渐受到关注并走俏。这是一种简单快捷的智慧化理财方式&#xff0c;通过将个人和家族的闲置资金投入到低风险高流动性的产品中。 国际财富管理投资机构AMCAP集团金融分析师表示&#xff1a;智能配置投资与理财之所以持续走俏&#xff0c…

如何选择共模噪声滤波器

在当前电子产品中&#xff0c;绝大多数的高速信号都使用地差分对结构。 差分结构有一个好处就是可以降低外界对信号的干扰&#xff0c;但是由于设计的原因&#xff0c;在传输结构上还会受到共模噪声的影响。 共模噪声滤波器就可以用于抑制不必要的共模噪声&#xff0c;而不会对…

什么是网络攻击?阿里云服务器可以避免被攻击吗?

网络攻击是指:损害网络系统安全属性的任何类型的进攻动作。进攻行为导致网络系统的机密性、完整性、可控性、真实性、抗抵赖性等受到不同程度的破坏。 网络攻击有很多种&#xff0c;网络上常见的攻击有DDOS攻击、CC攻击、SYN攻击、ARP攻击以及木马、病毒等等&#xff0c;所以再…

算法:Java计算二叉树从根节点到叶子结点的最大路径和

要求从根节点到叶子结点的最大路径和&#xff0c;可以通过递归遍历二叉树来实现。对于二叉树中的每个节点&#xff0c;我们都可以考虑包含该节点的最大路径和。在递归的过程中&#xff0c;我们需要不断更新全局最大路径和。 具体的思路 递归函数设计&#xff1a; 设计一个递归函…

蓝桥杯day02——第三大的数

题目 给你一个非空数组&#xff0c;返回此数组中 第三大的数 。如果不存在&#xff0c;则返回数组中最大的数。 示例 1&#xff1a; 输入&#xff1a;[3, 2, 1] 输出&#xff1a;1 解释&#xff1a;第三大的数是 1 。 示例 2&#xff1a; 输入&#xff1a;[1, 2] 输出&…

02-鸿蒙学习之4.0todoList练习

02-鸿蒙学习之4.0todoList练习 代码 /*** 1:组件必须使用Component装饰* 2.Entry 装饰哪个组件&#xff0c;哪个组件就呈现在页面上* 3.被Entry 装饰的入口组件。build&#xff08;&#xff09;必须有且仅有一个根 ** 容器 ** 组件* 其他的自定义组件&#xff0c;build() 中…

详解API开发【电商平台API封装商品详情SKU数据接口开发】

1、电商API开发 RESTful API的设计 RESTful API是一种通过HTTP协议发送和接收数据的API设计风格。它基于一些简单的原则&#xff0c;如使用HTTP动词来操作资源、使用URI来标识资源、使用HTTP状态码来表示操作结果等等。在本文中&#xff0c;我们将探讨如何设计一个符合RESTfu…

Re54:读论文 How Context Affects Language Models‘ Factual Predictions

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称&#xff1a;How Context Affects Language Models’ Factual Predictions ArXiv网址&#xff1a;https://arxiv.org/abs/2005.04611 2020年AKBC论文&#xff0c;作者来自脸书和UCL。 本文主要关注…

vscode Markdown 预览样式美化多方案推荐

优雅的使用 vscode写 Markdown&#xff0c;预览样式美化 1 介绍 我已经习惯使用 vscode 写 markdown。不是很喜欢他的 markdown 样式&#xff0c;尤其是代码块高亮的样式。当然用 vscode 大家基本上都会选择安装一个Markdown-preview-enhanced的插件&#xff0c;这个插件的确…

【C++】了解模板

这里是目录 前言函数模板函数模板的实例化类模板 前言 如果我们要交换两个数字&#xff0c;那么我们就需要写一个Swap函数来进行交换&#xff0c;那如果我们要交换char类型的数据呢&#xff1f;那又要写一份Swap的函数重载&#xff0c;参数的两个类型是char&#xff0c;那我们…

Python——— 函数大全

&#xff08;一&#xff09;初识函数 函数是可重用的程序代码块。 函数的作用&#xff0c;不仅可以实现代码的复用&#xff0c;更能实现代码的一致性。一致性指的是&#xff0c;只要修改函数的 代码&#xff0c;则所有调用该函数的地方都能得到体现。 在编写函数时&#xff0…

Linux常用命令----mkdir命令

文章目录 1. 基础概念2. 参数含义3. 常见用法4. 实例演示5. 结论 在Linux操作系统中&#xff0c;mkdir 命令是用来创建目录的基础命令。这个命令简单但极其强大&#xff0c;是每个Linux用户都应当熟悉的工具之一。以下是对mkdir命令的详细介绍&#xff0c;包括其参数含义、常见…

苹果cms搭建教程附带免费模板

准备工作: 一台服务器域名源码安装好NGINX+PHP7.0+MYSQL5.5 安装php7.0的扩展,fileinfo和 sg11,不安装网站会搭建失败。 两个扩展都全部安装好了之后 点击-服务-重载配置 这样我们的网站环境就配置完成啦 下载苹果cms 苹果cms程序github链接:选择mac10!下载即可 http…

Vue批量全局处理undefined和null转为““ 空字符串

我们在处理后台返回的信息&#xff0c;有的时候返回的是undefined或者null&#xff0c;这种字符串容易引起用户的误解&#xff0c;所以需要我们把这些字符串处理一下。 如果每个页面都单独处理&#xff0c;那么页面会很冗余&#xff0c;并且后期如果有修改容易遗漏&#xff0c…

DiSC沟通法,如何提高项目沟通效率?

DISC模型是一种用于理解和改善人际沟通的工具&#xff0c;它可以帮助团队成员更好地理解自己和他人的沟通方式&#xff0c;从而提高团队的沟通效率和协作效率。如果双方没有理解和适应对方的行为风格&#xff0c;往往容易造成误解甚至冲突&#xff0c;从而不利于团队间沟通协作…

vscode集成git

1、首先电脑要安装git 打开git官网地址&#xff1a;Git进行下载&#xff0c;如下图界面&#xff1a; 如图片中描述&#xff1a;一般进入官网后会识别电脑对应系统&#xff08;识别出了我的电脑是Windows系统 。如果未识别到电脑系统&#xff0c;可在左侧选择自己电脑对应的系统…

Influx集群解决方案(Influx Proxy篇)

InFluxDB 集群搭建 本次搭建使用influx proxy 介绍 github地址:https://github.com/chengshiwen/influx-proxy/ Influx Proxy 是一个基于高可用、一致性哈希的 InfluxDB 集群代理服务&#xff0c;实现了 InfluxDB 高可用集群的部署方案&#xff0c; 具有动态扩/缩容、故障恢复…

【MySQL】JDBC编程

&#x1f451;专栏内容&#xff1a;MySQL⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、JDBC工作原理二、JDBC 使用1、准备工作2、使用实例3、手动输入 一、JDBC工作原理 JDBC是Java语言中用于与数据库进行交互…

Panalog 日志审计系统 前台RCE漏洞复现

0x01 产品简介 Panalog是一款日志审计系统&#xff0c;方便用户统一集中监控、管理在网的海量设备。 0x02 漏洞概述 Panalog日志审计系统 sy_query.php接口处存在远程命令执行漏洞&#xff0c;攻击者可执行任意命令&#xff0c;接管服务器权限。 0x03 复现环境 FOFA&#xf…