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.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点击后执行...                

            }
        });
       
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

编码未来已然来临:无代码、低代码助力软件驱动世界

在当今时代&#xff0c;企业无不致力于探寻能够实现降本增效的有效路径。在众多热门技术中&#xff0c;AI人工智能和机器学习等概念已经被广泛采纳并应用于各行业的实际业务场景中。当企业开始树立起数字化意识&#xff0c;他们通常会选择以下两条路径中的一条来实现数字化转型…

如何运用智能安全帽、执法记录仪等技术手段提高隧道施工人员定位和安全监管效率?

应用需求 隧道中通常没有4G网络&#xff0c;无法搜到GPS卫星&#xff0c; 而领导从安全生产监管的角度&#xff0c;又需要看到现场的视频、录像、人员定位等。这正是本方案需要解决的问题。 系统特点 在无网络的隧道内部录像&#xff0c;紧急情况可派人出隧道&#xff0c;把…

SimpleCG小游戏开发系列(1)--扫雷

一、前言 前面我们学习了SimpleCG的游戏开发框架,从本篇开始,我们用一系列小游戏的开发来加深对框架的了解.我们先以windows的经典游戏--扫雷,作为首个例子。游戏预览如下 二、框架搭建 因为游戏程序的大体框架差不多&#xff0c;所以我们可以搭建一个通用的主程序。如下所示&a…

PC模糊搜索

双向绑定input输入框&#xff0c;监听值改变事件 <el-inputinput"input"v-model"queryParams.keyword"style"margin-bottom: 10px"type"text"prefix-icon"el-icon-search"size"small"placeholder"输入员工…

zookeeper集群(很少用)+kafka集群(常用)

一、zookeeper zookeeperkafka&#xff08;2.7.0版本&#xff09; kafka&#xff08;3.4.1版本&#xff09;不依赖于zookeeper 1、定义&#xff1a;zookeeper开源&#xff0c;分布式架构&#xff0c;提供协调服务&#xff08;Apache项目&#xff09;&#xff0c;基于观察者模…

【Python | 测试】assert 断言最佳实践

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

项目分享丨11行Python代码制作聊天机器人

前言 大家好&#xff0c;今天教大家如何用Python开发自己的聊天机器人&#xff0c;Python语言能做到&#xff0c;而且只需要11行代码。 一、项目思路 因为Python丰富的开源库&#xff0c;可以控制微信接收/发送消息&#xff0c;因此用python写一个简易的聊天机器人不难实现。…

JenKins快速安装与使用,Gitlab自动触发Jenkins

一、JenKins 0.准备&#xff0c;配置好环境 1&#xff09;Git&#xff08;yum安装&#xff09; 2&#xff09;JDK&#xff08;自行下载&#xff09; 3&#xff09;Jenkins&#xff08;自行下载&#xff09; 1.下载安装包 进官网&#xff0c;点Download下方即可下载。要下…

Spring Cloud Function Spel表达式注入 CVE-2022-22963 漏洞复现

Spring Cloud Function Spel表达式注入 CVE-2022-22963 漏洞复现 名称: Spring Cloud Function SPEL 远程代码执行 描述: Spring Cloud Function 是基于Spring Boot 的函数计算框架&#xff0c;它抽象出所有传输细节和基础架构&#xff0c;允许开发人员保留所有熟悉的工具和流…

open3d-点云及其操作

open3d提供了一个专门用于点云的数据结构 PointCloud。 class PointCloud(Geometry3D):color # 颜色normals # 法向量points # 点云def __init__(self, *args, **kwargs):"""__init__(*args, **kwargs)Overloaded function.1. __init__(self: open3d.cpu.py…

多个加速度计/麦克风连接指引

座舱内的振动投诉&#xff1a;如乘客/驾驶员在车厢内感受到传动轴、方向盘抖动剧烈 图1.三轴模式下的单个加速度计 图2.软件设置界面 如果您只有一个加速度计&#xff0c;可以在三轴模式下使用一个加速度计找出客户投诉车厢内振动最强烈的区域。例如将加速度计连接到驾驶员座椅…

猫头虎博主与CSDN的三年之约——我的创作纪念日三周年

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

关于大模型在文本分类上的尝试

文章目录 前言所做的尝试总结前言 总共25个类别,在BERT上的效果是48%,数据存在不平衡的情况,训练数据分布如下: 训练数据不多,4000左右 所做的尝试 1、基于 Qwen-14b-base 做Lora SFT,Loss忘记记录 准确率在68%左右 Lora配置 class LoraArguments:lora_r: int = 64…

我在Vscode学OpenCV 图像处理一(阈值处理、形态学操作【连通性,腐蚀和膨胀,开闭运算,礼帽和黑帽,内核】)

文章目录 一、阈值处理1.1 OpenCV 提供了函数 cv2.threshold()和函数 cv2.adaptiveThreshold()&#xff0c;用于实现阈值处理1.1.1. cv2.threshold()&#xff1a;(1)在函数cv2.threshold()中&#xff0c;参数threshold_type用于指定阈值处理的方式。它有以下几种可选的阈值类型…

C#开发的OpenRA游戏之属性SelectionDecorations(13)

C#开发的OpenRA游戏之属性SelectionDecorations(13) 在前面分析SelectionDecorations属性类时,会发现它有下面这个属性: public class SelectionDecorations : SelectionDecorationsBase, IRender { readonly Interactable interactable; 它是定义了一个Interactabl…

Python使用pywebview开发桌面应用:打造现代化、跨平台的用户体验

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在当今科技快速发展的时代&#xff0c;为了提供更好的用户体验&#xff0c;许多应用程序都转向了桌面应用的开发。在Python领域&#xff0c;pywebview是一款优秀的库&#xff0c;它使得用Web技术开发桌面应用变得…

Java高级技术(动态代理)

一&#xff0c;代理 二&#xff0c;案例 放到代码中演示&#xff1a; 首先&#xff0c;创建一个明星接口&#xff0c;这个接口有一个skill方法&#xff0c;说明只要是明星就必须有点技能。 public interface Star {void skill(); } 然后&#xff0c;创建坤坤对象&#xff0c…

震坤行自有品牌 | 搬运存储全面打造快速选型的标准品

震坤行自有品牌 | 搬运存储全面打造快速选型的标准品 中国仓储与配送协会2023年仓储配送行业发展与趋势展望报告中指出&#xff0c;截至2022年底&#xff0c;我国营业性通用&#xff08;常温&#xff09;仓库面积约为12.2亿㎡&#xff0c;仓储业&#xff08;含装卸搬运&#x…

池式组件 ----- Mysql连接池的原理实现

前言 本文是mysql连接池的实现。学完mysql连接池之后&#xff0c;接下来会结合多线程来进行测试&#xff0c;看看使用连接池性能高&#xff0c;还是不要连接池性能高&#xff0c;具体能差多少。当然这是下一篇文章了哈哈哈哈哈。当前首要任务是学会连接池&#xff0c;会都不会…

深度学习——激活函数汇总

深度学习——激活函数汇总 一、ReLU 一、ReLU 参考资料&#xff1a; https://zhuanlan.zhihu.com/p/428448728