如何定制化 ListView 界面

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、评论、收藏哦!👍

在上一篇文章中,我们介绍了 ListView的简单使用,只是简单的展示一段文本,现在我们开始对 ListView 界面进行定制。和网上其他案例类似,也是以水果图片为例,但本篇文章更加详细。

主要代码文件:

  • MainActivity 我们定义为 DIYListViewActivity,对应的 layout 布局文件为 activity_diylist_view.xml;

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListViewandroid:id="@+id/listView"android:layout_width="match_parent"android:layout_height="match_parent">
    </ListView></LinearLayout>
    
  • Fruit 实体类:用于描述水果的属性信息,对应的 layput 布局文件为 fruit_item.xml

  • FruitAdapter:自定义适配器

因为适配器是连接数据和视图的桥梁,视图是 ListView、而水果数据是数据,我们先定义一个实体类 Fruit ,作为 ListView 适配器的适配类型。

Fruit 类中有两个字段:

  • name:水果名字

  • imageId :水果图片id

class Fruit(val name:String,val imageId:Int)

在 ListView 文章中,ListView 的子项是一段文本,我们采用的是 Android 内置的布局文件,而我们定制化 ListView 界面的话,在本篇文章中 ListView 的子项水果数据,所以我们要新增一个布局文件,用于水果数据的具体展示(fruit_item.xml)。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="60dp"><ImageViewandroid:id="@+id/fruitImage"android:layout_width="40dp"android:layout_height="40dp"android:layout_gravity="center_vertical"android:layout_marginLeft="10dp"/><TextViewandroid:id="@+id/fruitName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_marginLeft="10dp" />
</LinearLayout>

我们还需要自定义一个适配器 FruitAdapter ,用于在 ListView 中显示水鬼,这个适配器继承 ArrayAdapter,并将范型指定为 Fruit 类,(范型:允许我们编写可以处理多种类型的代码,而不需要为每种类型编写重复的代码)

自定义适配器方法:继承现有适配器的实现类,例如 ArrayAdapter,重写 getView() 方法,在 getView() 方法中,创建一个 itemView,它是每个列表项的根视图。然后,我们通过调用 findViewById 来获取到自定义布局中的 ImageViewTextView 控件,然后,从数据源中获取对应位置的水果对象,并将水果对象的图片和名称设置给对应的视图控件,最后,返回 itemView

class FruitAdapter (activity: Activity,val resourceId: Int,data:List<Fruit>):ArrayAdapter<Fruit>(activity,resourceId,data) {override fun getView(position: Int,convertView: View?,parent:ViewGroup):View{val view = LayoutInflater.from(context).inflate(resourceId,parent,false)val fruitImage:ImageView = view.findViewById(R.id.fruitImage)val fruitName:TextView = view.findViewById(R.id.fruitName)val fruit = getItem(position) //获取当前项的Fruit实例if(fruit != null){fruitImage.setImageResource(fruit.imageId)fruitName.text = fruit.name}return  view}
}

详解:

  1. FruitAdapter 定义了一个主构造函数,用于将 Activity 的实例,ListView子项布局和 id 和数据源传递进来。

    class FruitAdapter (activity: Activity,val resourceId: Int,data:List<Fruit>):ArrayAdapter<Fruit>(activity,resourceId,data) 
    
  • activity: Activity 是构造函数的参数,表示当前的Activity

  • val resourceId: Int 是构造函数的参数,表示列表项的布局资源 id

  • data:List<Fruit> 是构造函数的参数,闭表示要显示的水果数据列表

    这里说的构造函数是 FruitAdapter 类的构造函数,在构造函数中,activity: Activity 参数用于接收传入的 Activity 对象,并将其传递给父类 ArrayAdapter 的构造函数。通过这种方式,FruitAdapter 类可以使用传入的 Activity 对象来执行一些与 UI 相关的操作,例如使用 LayoutInflater 创建视图、获取资源等。

  1. 重写 getView() 方法,用于获取指定位置上的列表项的视图。

    override fun getView(position: Int,convertView: View?,parent:ViewGroup):View{val view = LayoutInflater.from(context).inflate(resourceId,parent,false)val fruitImage:ImageView = view.findViewById(R.id.fruitImage)val fruitName:TextView = view.findViewById(R.id.fruitName)val fruit = getItem(position) //获取当前项的Fruit实例if(fruit != null){fruitImage.setImageResource(fruit.imageId)fruitName.text = fruit.name}
    
  • LayoutInflater.from(context) 创建 LayoutInflater 对象,用于将布局资源转换为视图;
  • inflate(resourceId,parent,false) 从指定的布局资源 ID 创建视图,parent 是父视图,false 表示不将视图附加到父视图上,即只让在父布局中声明的 layput 属性生效。
  • view.findViewById() 获取视图中的 fruitImage、fruitName
  • getItem(position) 方法从数据源中获取指定位置的水果对象,即获取当前项的 Fruit 实例。
    if(fruit != null) 如果水果对象不为空,调用 setImageResource()setText() 方法设置显示的图片和文字
  1. 最后,返回 设置好数据的视图 return view

好了,自定义适配器我们已经准备好了,接下来,我们写MainActivity中的逻辑代码

class DIYListViewActivity : AppCompatActivity() {private val fruitList = ArrayList<Fruit>()@SuppressLint("MissingInflatedId")override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)enableEdgeToEdge()setContentView(R.layout.activity_diylist_view)initFruits() //初始化水果数据var listView: ListView = findViewById(R.id.listView)val adapter = FruitAdapter(this,R.layout.fruit_item,fruitList)listView.adapter = adapterViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.listView)) { v, insets ->val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)insets}}// 初始化水果数据,private fun initFruits() {repeat(10){fruitList.add(Fruit("apple", R.drawable.apple_pic))fruitList.add(Fruit("banana", R.drawable.banana_pic))}}
}
// repeat函数是kotlin中常用标准函数,

Demo 展示
在这里插入图片描述

至此,定制化 ListView 界面 我们已经完成啦,赶快动手实践下吧。

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

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

相关文章

代码查重软件-自力更生

为了减轻工作量&#xff0c;自研了简单实用的代码查重工具&#xff0c;可以对若干文件之间进行查重。通过调试&#xff0c;相似度大于80%的没有一个是冤枉的。好用。去掉雷同的&#xff0c;其他的代码再慢慢看。

Python中的除法操作详解

在Python编程中&#xff0c;除法是一个基础但极其重要的算术操作。Python提供了多种除法运算方式&#xff0c;以适应不同的计算需求。以下是对Python中除法操作的全面介绍&#xff0c;包括示例代码。 1. 普通除法 / 普通除法使用/运算符&#xff0c;它返回一个浮点数结果&…

Java UU跑腿同城跑腿小程序源码快递代取帮买帮送源码小程序+H5+公众号跑腿系统

&#x1f680;【同城生活小助手】&#x1f680; &#x1f3c3;‍♂️【同城跑腿&#xff0c;即刻送达的便利生活】&#x1f3c3;‍♀️ 在快节奏的都市生活中&#xff0c;时间成了最宝贵的资源。UU跑腿小程序&#xff0c;作为同城生活的得力助手&#xff0c;让你轻松解决生活…

​如何部署私有化地图服务器(Windows版)

用户希望我们能详细讲讲&#xff0c;如何通过《水经注地图服务》进行私有化部署做一个地图服务器。 现在就来为大家作一个较为详细的分享&#xff0c;希望能在私有化部署地图服务器的工作中&#xff0c;助你一臂之力&#xff01; 《水经注地图服务》下载与安装 打开以下官方…

Embedded Coder代码生成优化

Embedded Coder为 MATLAB Coder 产品扩展了可用于嵌入式软件开发的功能。您可以生成具有专业人工代码的清晰度和效率的代码。例如&#xff0c;您可以&#xff1a; 生成紧凑、快速的代码&#xff0c;这对实时仿真器、目标系统快速原型构建板、大规模生产中使用的微处理器以及嵌…

从深度学习到音乐创作:AI如何重新定义音乐行业

&#x1f4d1;引言 近一个月来&#xff0c;随着几款音乐大模型的轮番上线&#xff0c;AI在音乐产业的角色迅速扩大。这些模型不仅将音乐创作的门槛降至前所未有的低点&#xff0c;还引发了一场关于AI是否会彻底颠覆音乐行业的激烈讨论。从初期的兴奋到现在的理性审视&#xff0…

IO模型与多路复用

前言 在Linux中有一句经典台词&#xff1a;“Linux一切皆文件”。IO操作是与文件进行交流的唯一方式&#xff0c;也就是说这是与Linux系统交流的唯一手段。就如同人与人之间的交流&#xff0c;如果我们连交流的方式都不甚了解&#xff0c;交流的效率就会变得低下。操作系统也是…

机械设备制造企业MES系统解决方案介绍

机械设备制造行业涵盖了各类工业设备、工程机械、农业机械等多个领域&#xff0c;对生产精度、质量控制和效率提出了较高要求。为了提升生产效率、保证产品质量并满足客户需求&#xff0c;越来越多的机械设备制造企业引入了MES系统。本文将详细介绍MES系统在机械设备制造行业的…

CPPTest设计分析

目录 1 概述2 设计3 扩展Output3.1 扩展实例 1 概述 CppTest是一个可移植、功能强大但简单的单元测试框架&#xff0c;用于处理C中的自动化测试。重点在于可用性和可扩展性。支持多种输出格式&#xff0c;并且可以轻松添加新的输出格式。 CppTest下载地址Sourceforge Github地…

Java StringBuffer类和StringBuilder类

在使用 StringBuffer 类时&#xff0c;每次都会对 StringBuffer 对象本身进行操作&#xff0c;而不是生成新的对象&#xff0c;所以如果需要对字符串进行修改推荐使用 StringBuffer。 StringBuilder 类在 Java 5 中被提出&#xff0c;它和 StringBuffer 之间的最大不同在于 St…

IO优化 C++ IO使用优化技巧

在编程中&#xff0c;输入/输出&#xff08;I/O&#xff09;操作通常是影响程序性能的主要瓶颈之一。 优化 I/O 操作可以显著提高程序的效率&#xff0c; 特别是在处理大量数据或需要频繁进行 I/O 操作的应用中。 以下是一些常见的 I/O 优化技巧&#xff1a; 1. 缓冲 I/O …

DataWhale-吃瓜教程学习笔记 (六)

学习视频**&#xff1a;第4章-决策树_哔哩哔哩_bilibili 西瓜书对应章节&#xff1a; 第五章 5.1&#xff1b;5.2&#xff1b;5.3 文章目录 MP 神经元- 感知机模型 &#xff08;分类模型&#xff09;-- 损失函数定义--- 感知机学习算法 - 随机梯度下降法 - 神经网络需要解决的问…

WPF引入控件模板

控件模板基础 需求 需求&#xff1a;客户对目前的控件样式不满意&#xff0c;需要修改样式。 每一个控件都有Template属性&#xff0c;可以定制样式。 我下面以Button为例子&#xff1a; <Button Content"Button" Height"30" Width"100"…

docker mysql cpu100% cpu打满排查 mysql cpu爆了 mysql cpu 100%问题排查

1. docker 启动了一个mysql 实例&#xff0c;近期忽然发现cpu100% 如下图所示 命令&#xff1a; top 2.进入容器内排查&#xff1a; docker exec mysql&#xff08;此处可以是docker ps -a 查找出来的image_id&#xff09; -it /bin/bash cd /var/log cat mysqld.log 容器内m…

2024年Stable Diffusion下载+安装+使用教程(超详细版本)收藏这一篇就够了!

本篇咱们要聊的是如何用“整合包”来搞定StabIe Diffusion WebUI的本地安装和使用&#xff0c;别担心&#xff0c;你不需要成为计算机大神&#xff0c;新手也能轻松上手。不过得提醒一下&#xff0c;你的硬盘得留出100G~200G的空间来&#xff0c;才能玩得转。 整合包放这里&am…

网站被浏览器提示“不安全”的解决办法

在互联网时代&#xff0c;网站的安全性直接关系到用户体验和品牌形象。当用户访问网站时&#xff0c;如果浏览器出现“您与此网站之间建立的连接不安全”的警告&#xff0c;这不仅会吓跑潜在客户&#xff0c;还可能对网站的SEO排名造成等负面影响。 浏览器发出的“不安全”警告…

MetaGPT-DataInterpreter源码解读

MetaGPT-DataInterpreter源码解读 MetaGPT 是一种多智能体框架&#xff0c;其利用SOP&#xff08;Standard Operating Procedures&#xff09;来协调多智能体系统。即&#xff1a;多智能体智能体环境标准流程&#xff08;SOP&#xff09;通信经济 DataInterpreter &#xff1a;…

无人机基础知识(模式篇)

姿态模式&#xff1a;姿态模式通常是在GPS模式无法使用的情况下进行操作的模式。通过操作杆对无人机进行操控&#xff0c;姿态模式下无人机只能提供自稳&#xff0c;不提供定点悬停&#xff0c;受外界影响很大&#xff1b; GPS模式&#xff1a;GPS模式通俗一点就是依靠GPS将无…

22、PHP 实现连续子数组的最大和、整数中1出现的次数

题目&#xff1a; PHP 实现连续子数组的最大和 描述&#xff1a; HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。 今天测试组开完会后,他又发话了:在古老的一维模式识别中, 常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。 但是,如果向量中包含负数…

【原创教程】一次搞定伺服原点问题(进阶篇)

我们在进行伺服控制时,经常会遇到伺服原点问题,有时被其复杂的原点回归方式弄的不知所措,本篇文章我们将伺服原点遇到的问题进行了总结,便于大家将此彻底搞明白。 1 伺服原点 1.1 原点的概念 伺服原点是指在伺服系统中的初始位置,用来标记机构的起点。其他后面的一切运…