Android RecyclerView 如何展示自定义列表 Kotlin

Android RecyclerView 如何展示自定义列表 Kotlin

一、前提

有这么一个对象

class DeviceDemo (val name: String, val type: String, val address: String)

要展示一个包含这个对象的列表

bluetoothDevices.add(DeviceDemo("bb 9800", "LE", "32:34:34:23:23"))
bluetoothDevices.add(DeviceDemo("bb 9900", "RN/LE", "32:34:34:23:23"))
bluetoothDevices.add(DeviceDemo("iPhone 15 Pro", "LE", "32:34:34:23:23"))

最终效果是这样的:

在这里插入图片描述

二、定义所需要的视图 layout

1. 定义列表单元格的 layout

就是定义一个普通的 layout 视图,这个视图就是列表中每个元素的视图,自己随意定义,别忘了给每个元素添加 id。

recyclerview_cell.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:orientation="horizontal"android:gravity="left"android:layout_height="wrap_content"><LinearLayoutandroid:gravity="center"android:layout_width="wrap_content"android:layout_height="match_parent"><TextViewandroid:id="@+id/list_cell_bt_index"android:textAlignment="textEnd"android:layout_marginRight="10dp"android:text="1."android:textColor="@color/white"android:textSize="18dp"android:fontFamily="@font/jetbrainsmono_bold"android:layout_width="50dp"android:layout_height="wrap_content"/></LinearLayout><LinearLayoutandroid:gravity="center"android:orientation="vertical"android:layout_width="wrap_content"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="left"android:orientation="horizontal"><TextViewandroid:id="@+id/list_cell_bt_name"android:layout_width="match_parent"android:layout_height="match_parent"android:fontFamily="@font/jetbrainsmono_bold"android:text="BlackBerry Q10"android:textSize="14dp"android:textAlignment="center"android:textColor="@color/white" /><TextViewandroid:id="@+id/list_cell_bt_type"android:fontFamily="@font/jetbrainsmono_bold"android:layout_marginLeft="10dp"android:textSize="12dp"android:layout_gravity="bottom"android:layout_width="match_parent"android:layout_height="match_parent"android:text="低功耗"android:textColor="@color/btBlue" /></LinearLayout><TextViewandroid:layout_gravity="left"android:id="@+id/list_cell_bt_mac"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="34:53:E3:12:23:45"android:textColor="@color/white" /></LinearLayout>
</LinearLayout>

2. 在你的主视图 xml 中添加 RecyclerView

如下,两个地方需要注意:

  • layoutManager 就在下面这个值
  • listitem 是指的你的列表中每个单元 cell 的视图 layout,也就是上面第1步里定义的视图。
<androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerview"android:layout_width="match_parent"android:layout_height="170dp"app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"tools:listitem="@layout/recyclerview_cell" />

这样就能在 xml 预览窗口中看到这个列表的样子,这样关于视图的定义就完成了。

在这里插入图片描述

三、定义对应的程序代码

列表是上面已经定义好的 DeviceDemo 类型的 List。就不再重新定义这个
要想展示这个列表,需要用到 Adapter,它的类型是 RecyclerView.Adapter

1. 定义基础元素、数据

这里只做演示用,所以定义了简单的对象:

class DeviceDemo (val name: String, val type: String, val address: String)// 新建一个 list 对象,演示数据
private var bluetoothDevices = mutableListOf<DeviceDemo>()bluetoothDevices.add(DeviceDemo("bb 9800", "LE", "32:34:34:23:23"))
bluetoothDevices.add(DeviceDemo("bb 9900", "RN/LE", "32:34:34:23:23"))
bluetoothDevices.add(DeviceDemo("iPhone 15 Pro", "LE", "32:34:34:23:23"))

2. 定义 adapter

就是定义一个自己的 adapter,在里面实现 ViewHolder 方法,对上面定义的单元格视图和数据进行绑定。
需要重写 onBindViewHolder onCreateViewHolder getItemCount 几个方法变量

package cn.kylebing.blackberry.q10_keyboardimport android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerViewclass BluetoothDeviceRecycleListAdapter(private val dataSet: MutableList<DeviceDemo>) :RecyclerView.Adapter<BluetoothDeviceRecycleListAdapter.ViewHolder>() {class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {val index: TextViewval deviceName: TextViewval deviceMac: TextViewval deviceType: TextViewinit {index = view.findViewById(R.id.list_cell_bt_index)deviceName = view.findViewById(R.id.list_cell_bt_name)deviceMac = view.findViewById(R.id.list_cell_bt_mac)deviceType = view.findViewById(R.id.list_cell_bt_type)}}override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {val view = LayoutInflater.from(viewGroup.context).inflate(R.layout.recyclerview_cell, viewGroup, false)return ViewHolder(view)}override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {viewHolder.index.text = position.toString()viewHolder.deviceName.text = dataSet.get(position).nameviewHolder.deviceMac.text = dataSet.get(position).addressviewHolder.deviceType.text = dataSet.get(position).type}override fun getItemCount() = dataSet.size
}

3. 主程序中调用

class MainActivity : AppCompatActivity() {private var bluetoothDevices = mutableListOf<DeviceDemo>()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.bluetooth_info_panel)bluetoothDevices.add(DeviceDemo("bb 9800", "LE", "32:34:34:23:23"))bluetoothDevices.add(DeviceDemo("bb 9900", "RN/LE", "32:34:34:23:23"))bluetoothDevices.add(DeviceDemo("iPhone 15 Pro", "LE", "32:34:34:23:23"))// recycleViewval recycleView = findViewById<RecyclerView>(R.id.recyclerview)val adapter = BluetoothDeviceRecycleListAdapter(bluetoothDevices)recycleView.setAdapter(adapter)}
}

四、List 数据发生变化时更新界面

不可避免的,你可能需要更新原列表数据,比如删除或添加元素,此时需要界面跟着更新,就需要找到 RecyclerView 的 adapter,执行 adapter.notifyItemRangeChanged() 告知 adapter 进行更新。

bluetoothDevices.add(DeviceDemo("new device", "LE", "32:34:34:23:23"))findViewById<RecyclerView>(R.id.recyclerview).adapter?.notifyDataSetChanged()

五、结果

在这里插入图片描述

最终经过修改我实现的效果是这样的:

在这里插入图片描述

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

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

相关文章

蛇形矩阵3

题目描述 把数1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;…&#xff0c;N*N按照“蛇形3”放入N*N矩阵的中&#xff0c;输出结果。 下面是N6的蛇形3的图示 输入格式 第一行1个正整数&#xff1a;N&#xff0c;范围在[1,100]。 输出格式 N行&#x…

docker 容器访问 GPU 资源使用指南

概述 nvidia-docker 和 nvidia-container-runtime 是用于在 NVIDIA GPU 上运行 Docker 容器的两个相关工具。它们的作用是提供 Docker 容器与 GPU 加速硬件的集成支持&#xff0c;使容器中的应用程序能够充分利用 GPU 资源。 nvidia-docker 为了提高 Nvidia GPU 在 docker 中的…

Linux系统前后端分离项目

目录 一.jdk安装 二.tomcat安装 三.MySQL安装 四.nginx安装 五.Nginx负载均衡tomcat 六.前端部署 一.jdk安装 1. 上传jdk安装包 jdk-8u151-linux-x64.tar.gz 进入opt目录&#xff0c;将安装包拖进去 2. 解压安装包 这里需要解压到usr/local目录下&#xff0c;在这里新建一个…

力扣思路题:丑数

此题的思路非常奇妙&#xff0c;可以借鉴一下 bool isUgly(int num){if(num0)return false;while(num%20)num/2;while(num%30)num/3;while(num%50)num/5;return num1; }

学会玩游戏,智能究竟从何而来?

最近在读梅拉妮米歇尔《AI 3.0》&#xff0c;第九章谈到学会玩游戏&#xff0c;智能究竟从何而来&#xff1f; 作者: [美] 梅拉妮米歇尔 出版社: 四川科学技术出版社湛庐 原作名: Artificial Intelligence: A Guide for Thinking Humans 译者: 王飞跃 / 李玉珂 / 王晓 / 张慧 …

Xcode与Swift开发小记

引子 鉴于React Native目前版本在iOS上开发遇到诸多问题&#xff0c;本以为搞RN只需理会Javascript开发&#xff0c;没想到冒出CocoaPod的一堆编译问题。所以横下一条心&#xff0c;决定直接进攻iOS本身。不管你是用React Native&#xff0c;还是用Flutter&#xff0c;iOS下的…

网站开发--详解Servlet

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;网站开发–详解Servlet 一.基本介绍 tomcat是Java中开发服务器的重要的一个工具,任何开发的服务器都要部署在tomcat之上,可以说tomcat是所有服务器的底座,为了更好的操作http,to…

配置多个后端 API 代理

在开发 React 应用时&#xff0c;通常会涉及到与后端 API 的交互。而在开发过程中&#xff0c;我们经常需要在开发环境中使用代理来解决跨域请求的问题。Create React App 提供了一种简单的方式来配置代理&#xff0c;即通过创建一个名为 setupProxy.js 的文件来配置代理规则。…

Linux之安装jdk,tomcat,mysql,部署项目

目录 一、操作流程 1.1安装jdk 1.2安装tomcat&#xff08;加创建自启动脚本&#xff09; 1.3 安装mysql 1.4部署项目 一、操作流程 首先把需要用的包放进opt文件下 1.1安装jdk 把jdk解压到/usr/local/java里 在刚刚放解压包的文件夹打开vim /etc/profile编辑器&#xff0c…

高防服务器的原理

高防服务器的原理是什么?高防服务器的原理可以从哪些方面解读&#xff0c;小编为您整理发布高防服务器的工作原理主要基于以下几个方面&#xff1a; - **防火墙配置**&#xff1a;在服务器的节点上配置防火墙&#xff0c;能够自动过滤网络恶意攻击&#xff0c;提高网络安全性。…

Linux之部署前后端分离项目

Nginx配置安装 1.安装依赖 我们这里安装的依赖是有4个的 [rootlocalhost opt]# yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 2.上传解压安装包 [rootlocalhost opt]# tar -xvf nginx-1.13.7.tar.gz -C /usr/local/java/3.安装Nginx &#xff0…

聚观早报 | OPPO公布全新AI战略;华为P70 Art影像细节曝光

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 2月22日消息 OPPO公布全新AI战略 华为P70 Art影像细节曝光 苹果正加速开发智能戒指 微软将大规模投资人工智能 …

openGauss学习笔记-229 openGauss性能调优-系统调优-配置Ustore

文章目录 openGauss学习笔记-229 openGauss性能调优-系统调优-配置Ustore229.1 设计原理229.2 核心优势229.3 使用指导 openGauss学习笔记-229 openGauss性能调优-系统调优-配置Ustore Ustore存储引擎&#xff0c;又名In-place Update存储引擎&#xff08;原地更新&#xff09…

北上广深数据分析岗位的薪资对比

目录 一、数据介绍及预处理 1、数据介绍 2、数据预处理 二、数据分析 1、岗位数量、薪资水平统计 3、企业维度岗位数量 4、top薪资岗位 三、划重点 少走10年弯路 之前跟大家分享过BOSS直聘上base北京的数据分析职位薪资数据分析&#xff0c;这次爬了北上广深四个城市的…

【MySQL面试复习】详细说下事务的特性

系列文章目录 在MySQL中&#xff0c;如何定位慢查询&#xff1f; 发现了某个SQL语句执行很慢&#xff0c;如何进行分析&#xff1f; 了解过索引吗&#xff1f;(索引的底层原理)/B 树和B树的区别是什么&#xff1f; 什么是聚簇索引&#xff08;聚集索引&#xff09;和非聚簇索引…

GEE数据集——全球无缝高分辨率温度数据集(GSHTD)

全球无缝高分辨率温度数据集&#xff08;GSHTD&#xff09; 本研究中介绍的全球无缝高分辨率温度数据集&#xff08;GSHTD&#xff09;为各领域的研究人员提供了全面而宝贵的资源。该数据集涵盖 2001 年至 2020 年&#xff0c;主要关注陆地表面温度 (Ts) 和近地面气温 (Ta)。GS…

camunda7流程平台技术架构概述

Camunda Platform 是一个基于 Java 的BPMN(流程引擎)、DMN&#xff08;规则引擎&#xff09;、CMMN&#xff08;案例管理&#xff09;的开源框架。主要组件是用 Java 编写的&#xff0c;主要专注于为 Java 开发人员提供在 JVM 上设计、实现和运行业务流程和工作流所需的工具&am…

【AIGC大模型】跑通wonder3D (windows)

论文链接&#xff1a;https://arxiv.org/pdf/2310.15008.pdf windows10系统 显卡&#xff1a;NVIDIA rtx 2060 一、安装anaconda 二、安装CUDA 11.7 (CUDA Toolkit 11.7 Downloads | NVIDIA Developer) 和 cudnn 8.9.7(cuDNN Archive | NVIDIA Developer)库 CUDA选择自定…

接口自动化测试用例如何设计

说到自动化测试&#xff0c;或者说接口自动化测试&#xff0c;多数人的第一反应是该用什么工具&#xff0c;比如&#xff1a;Python Requests、Java HttpClient、Apifox、MeterSphere、自研的自动化平台等。大家似乎更关注的是哪个工具更优秀&#xff0c;甚至出现“ 做平台的 &…

前后端分离Vue+node.js在线学习考试系统gqw7o

与其它应用程序相比&#xff0c;在线学习平台的设计主要面向于学校&#xff0c;旨在为管理员和学生、教师、院系提供一个在线学习平台。学生、教师、院系可以通过系统及时查看公告信息等。 在线学习平台是在Windows操作系统下的应用平台。为防止出现兼容性及稳定性问题&#xf…