Android开发——ListView

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_height="match_parent"android:layout_width="match_parent"android:id="@+id/main"android:orientation="vertical"><ListViewandroid:id="@+id/lv"android:layout_width="match_parent"android:layout_height="match_parent"></ListView></LinearLayout>

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="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/tv"android:layout_width="match_parent"android:layout_height="match_parent"android:textSize="30sp"/></LinearLayout>

item.xml 是用于定义列表项布局的 XML 文件。在 Android 中,通常使用 ListViewRecyclerView 来显示列表数据,而列表中的每一项就是一个列表项。item.xml 文件用于定义列表中每一项的布局结构,包括显示数据的控件(如 TextViewImageView 等)以及它们的样式和排列方式。

在使用 ListViewRecyclerView 时,你需要创建一个适配器(Adapter),并在适配器中指定列表项的布局文件(即 item.xml),以便在列表中显示每一项的内容。适配器根据数据源中的数据,动态地加载布局文件,并将数据填充到布局中,然后显示在列表中。

因此,item.xml 文件的作用是定义列表中每一项的布局结构,它决定了列表中每个数据项的显示样式和内容:

MyAdapter.java

package com.example.myapplication;import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;import java.util.ArrayList;public class MyAdapter extends BaseAdapter {private final ArrayList<bean> data;private final Context context;public MyAdapter(ArrayList<bean> data,Context context){this.data = data;this.context = context;}@Overridepublic int getCount() {return data.size();}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return position;}@SuppressLint("SuspiciousIndentation")@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder;if (convertView == null) {convertView = LayoutInflater.from(context).inflate(R.layout.item, parent, false);viewHolder = new ViewHolder();viewHolder.textView = convertView.findViewById(R.id.tv);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}viewHolder.textView.setText(data.get(position).getName());return convertView;}static class ViewHolder {TextView textView;}}

这段代码是一个自定义的适配器(Adapter),用于将数据绑定到列表视图(ListView)中。逐步解释:

  1. MyAdapter 类继承自 BaseAdapter,它是 Android 中适配器的基类之一,用于在列表视图中显示数据。
  2. 构造方法 MyAdapter(ArrayList<bean> data, Context context) 接收一个 ArrayList 类型的数据源和一个上下文对象。数据源是用来填充列表项的数据,而上下文对象用于加载布局文件。
  3. getCount() 方法返回数据源中的数据项数量,即列表中的项数。
  4. getItem() 方法根据位置返回数据项。
  5. getItemId() 方法返回数据项的唯一标识符,通常是其在数据源中的位置。
  6. getView() 方法用于获取每个列表项的视图。它接收三个参数:位置(position)、可重用的视图(convertView)和列表的父视图(parent)。
    • 在方法中,首先通过 LayoutInflater 加载列表项的布局文件 R.layout.item,如果 convertView 为 null,则新建一个视图,并将其缓存在 ViewHolder 对象中,以提高性能。
    • 然后,从缓存的 ViewHolder 对象中获取视图控件,并将数据绑定到控件上,设置相应的文本。
    • 最后,返回填充好数据的视图。
  7. ViewHolder 类是一个内部静态类,用于缓存列表项中的视图控件,以便在滚动列表时快速访问,提高性能。

MainActivity.java

package com.example.myapplication;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import java.util.ArrayList;public class MainActivity extends AppCompatActivity {private final ArrayList<bean> data = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});for(int i=0;i<100;i++){bean bn = new bean();bn.setName("WJH"+i);data.add(bn);}ListView listview = findViewById(R.id.lv);listview.setAdapter(new MyAdapter(data,this));}}
  1. MainActivity 类继承自 AppCompatActivity,它是 Android 中的一个活动(Activity)类,用于展示用户界面和处理用户交互。
  2. onCreate() 方法中,首先调用了父类的 onCreate() 方法以执行基本的初始化操作。
  3. 接着调用 EdgeToEdge.enable(this) 方法启用了边缘到边缘布局,该方法来自于第三方库,用于在 Android 应用中实现全屏显示。
  4. 使用 setContentView(R.layout.activity_main) 方法设置了当前活动的布局为 activity_main.xml
  5. 使用 ViewCompat.setOnApplyWindowInsetsListener() 方法监听窗口布局变化,并在发生变化时调整主布局的内边距,以适应系统状态栏和导航栏。
  6. 创建了一个包含 100 个 bean 对象(自定义对象)的 ArrayList,用于作为列表视图的数据源。
  7. 使用 for 循环生成 100 个 bean 对象,并设置它们的名称。
  8. 获取列表视图对象 ListView 并通过 findViewById() 方法找到对应的视图。
  9. 使用自定义的适配器 MyAdapter 将数据源绑定到列表视图上,从而在界面上显示出来。

综上所述,这段代码实现了一个简单的活动,在界面中显示了一个包含 100 个列表项的列表视图,并且使用了边缘到边缘布局来实现全屏显示效果。

PS:

适配器类的作用是:

  1. 数据适配: Adapter类用于将数据源与UI控件进行绑定,将数据适配到特定的UI组件中,比如ListView、RecyclerView等。它负责从数据源中获取数据,并将数据呈现到相应的UI组件上。

  2. 视图渲染: Adapter负责渲染数据项的视图,即将数据显示在UI组件上。在Adapter中,通过实现getView()方法,可以定义每个数据项的呈现方式,包括布局、样式、内容等。

  3. 视图复用: 为了提高性能和节省资源,Android中的ListView、RecyclerView等UI组件在滚动时会复用已经创建的视图对象。Adapter类负责管理视图的创建和复用,确保在滚动过程中能够高效地显示数据。

  4. ViewHolder模式: 为了进一步提高性能,Adapter类通常会采用ViewHolder模式对视图进行缓存。ViewHolder是一个简单的Java类,用于保存视图对象的引用,避免在getView()方法中重复查找视图,从而提高渲染效率。

  5. 数据更新: 当数据源发生变化时,Adapter负责通知UI组件进行相应的更新。它提供了一系列的方法,比如notifyDataSetChanged()、notifyItemInserted()等,用于通知UI组件刷新数据。

总的来说,Adapter类在Android开发中起到了桥梁的作用,连接了数据源和UI组件,负责将数据呈现到界面上,并提供了一系列的方法和机制,保证了界面的流畅性和用户体验

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

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

相关文章

SpringBoot使用maven指定依赖包的版本

目录 1. 解决示例2. 完整pom示例 前言&#xff1a;我们在使用A依赖的时候&#xff0c;这个依赖有引入了第三方B依赖&#xff0c;这时候我想指定B依赖的版本号 1. 解决示例 我想将 mysql、logback、tomcat 的版本升级到指定版本 只需在 pom.xml 文件的 properties 里面添加如下…

3D模型格式转换工具HOOPS Exchange:3D CAD数据的快速导入与导出

在当今的工程设计领域中&#xff0c;快速且可靠地处理3D CAD数据是至关重要的。HOOPS Exchange SDK通过提供一组C软件库&#xff0c;为开发团队提供了实现这一目标的有效工具。 什么是HOOPS Exchange&#xff1f; HOOPS Exchange是一组C软件库&#xff0c;旨在为开发团队提供…

已解决 数据库异常 SQLSyntaxErrorException:FUNCTION count does not exist.

今天排查问题看到数据库报错 Caused by: java.sql.SQLSyntaxErrorException: FUNCTION your_table_name(你的数据库名字).count does not exist. Check the Function Name Parsing and Resolution section in the Reference Manual然后查了很久才找到问题 在COUNT和括号之间有…

YOLOv1精读笔记

YOLO系列 摘要1. 将目标检测视为一个回归问题2. 定位准确率不如 SOTA&#xff0c;但背景错误率更低3. 泛化能力强 1.引言1.1 YOLO 速度很快1.2 全局推理 2. Unified Detection2.1 网络设计2.2 训练YOLOv1模型损失函数的选择和其潜在的问题YOLOv1模型如何改进其损失函数来更好地…

反射应用简单案例

day40 反射应用 案例 1.万能数组扩容 设置泛型的copyof仅支持引用数据类型&#xff0c;即任意类型&#xff0c;直接new数组不行&#xff0c;利用反射实现扩容&#xff1b; 打印调用toString也进行编写&#xff0c;利用StringBuffer或者StringBiulder进行字符串拼接 public c…

华为OD-C卷-伐木工[200分]Python3-100%

题目描述 一根X米长的树木,伐木工切割成不同长度的木材后进行交易,交易价格为每根木头长度的乘积。 规定切割后的每根木头长度都为正整数;也可以不切割,直接拿整根树木进行交易。 请问伐木工如何尽量少的切割,才能使收益最大化? 输入描述 木材的长度(X ≤ 50) 输出描…

tomcat部署两个相同端口前端,一个后端(Windows)

tomcat/webapps下 互联网端的包为ROOT和XXX&#xff08;XXX为项目名&#xff09; 一体机端只有一个前端包ABC 把ROOT下的所有文件剪切到XXX下的WEB-INF下classes下创建一个文件夹名叫static 把新的一体机的前端ABC的文件放到ROOT下即可 注意&#xff1a;ABC和static下的ind…

【史上最全】带你全方位了解containerd 的几种插件扩展模式

除了 snapshotter&#xff0c;containerd 的扩展机制你还了解哪些&#xff1f; 本文内容节选自 《containerd 原理剖析与实战》&#xff0c;本书正参加限时优惠内购&#xff0c;限时 69.9 元购买。 进入正题之前先看一下 containerd 的整体架构 1. containerd 架构 图 contain…

List<int[]>[] g = new ArrayList[n];

在Java中&#xff0c;List<int[]>[] g new ArrayList[n]; 这行代码定义了一个数组 g&#xff0c;该数组的每个元素都是一个 ArrayList<int[]> 类型的对象。这里&#xff0c;n 是预期图中顶点的数量&#xff0c;因此 g 数组的长度是 n。 List<int[]>&#x…

UE4_常见动画节点学习_Two Bone IK双骨骼IK

学习资料&#xff0c;仅供参考&#xff01; Two Bone IK 控制器将逆运动&#xff08;IK&#xff09;解算器应用于到如角色四肢等3关节链。 变量&#xff08; HandIKWeight &#xff09;被用于在角色的 hand_l 和 hand_r 控制器上驱动 关节目标位置&#xff08;Joint Target Lo…

Elasticsearch克隆索引

我所使用的Elasticsearch的版本是基于7.17.7。 需求是将某个ES的索引进行克隆。例如我要将索引test_0419_1克隆一份新的索引test_0419_2。步骤如下&#xff1a; 首先将源索引进行修改PUT /test_0419_1/_block/write&#xff0c;即禁止对这个索引进行写数据操作。然后执行克隆…

Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错的问题

连接报错 解决方案 解决方法1&#xff1a;升级navicat 解决方法2&#xff1a;降级pgsql 解决方法3&#xff1a;修改dll 使用3解决 实操演示 1、 打开 Navicat 安装目录&#xff0c;找到libcc.dll文件 2、备份libcc.dll文件&#xff0c;将其复制并粘贴或者修改副本为任何其他名…

java知识点 --- 类

在 Java 中&#xff0c;类&#xff08;Class&#xff09;是一个核心的面向对象编程概念&#xff0c;它扮演着构建软件组件的基本单元的角色。类是定义对象的蓝图或模板&#xff0c;它包含了创建特定类型对象所需的数据&#xff08;称为成员变量或属性&#xff09;和行为&#x…

前摇和后摇

在许多动作游戏和竞技游戏中&#xff0c;特别是那些包含战斗机制的游戏&#xff0c;“前摇”&#xff08;Pre-cast delay&#xff09;和"后摇"&#xff08;Post-cast delay&#xff09;是描述特定动作或技能释放过程中的两个关键阶段。这些概念主要用于增加游戏的战术…

【C++杂项】cin的详细用法

cin详细用法 1. cin简介2. cin的常用读取方法2.1 cin>>的用法2.2 cin.get的用法2.3 cin.getline的用法 3. cin清空输入缓冲区4. 其它方法4.1 getline()读取一行 1. cin简介 cin是C中的标准输入流对象&#xff0c;即istream类的对象。cin主要用于从标准输入读取数据&…

ORACLE中impdp导入多个文件的方法

1、多个文件导入dumpfileexpdp_full_qytcdb_20240412_%U.dmp&#xff0c;%U代表01、02、03这些 impdp sys/123456192.168.1.200:1521/Oracle directoryjy dumpfileexpdp_full_20250412_%U.dmp logfileimpdp_$(date %Y%m%d).log table_exists_actionskip fully parallel8; 2、…

DNS服务器的管理与配置

目录 一、相关知识 域名空间 DNS服务器分类 域名解析过程 资源记录 二、安装DNS服务 安装bind软件包 DNS服务的启动与停止 配置主要名称服务器 主配置文件 从例子学起&#xff1a; &#xff08;1&#xff09;建立主配置文件named.conf &#xff08;2&#xff09;…

Windows10安装Docker Desktop(大妈看了都会)

目录 Windows10安装Docker Desktop&#xff08;大妈看了都会&#xff09; 1.前言 1.1 为什么要在Windows10上安装Docker 1.2 Docker Desktop介绍 2.下载Docker Desktop 3.启用Hyper-V以在 Windows 10上创建虚拟机 4.安装Docker Desktop 5.运行Docker Desktop 6.Docker…

阿里云图片处理之 缩放

文档 : https://help.aliyun.com/zh/oss/user-guide/resize-images-4?spma2c4g.11186623.0.0.61cd2759v4jkhX 需求 : 图片过大, 导致加载过慢, 需对图片进行压缩 <image :src"imgUrl ?x-oss-processimage/resize,h_700,m_lfit"></image>Ps : 题外话…

Linux下GPU虚拟化

在新Linux内核中体验GPU虚拟化 从内核4.10&#xff0c; 支持 virtual gpu 的代码开始汇入主线程。这部分代码主要由两部分组成&#xff1a; 首先&#xff0c; mediated 设备框架&#xff08;mdev&#xff09;&#xff0c;基本上&#xff0c;这部分代码使得内核驱动开始用vfio框…