安卓开发---BaseAdapter(定制ListView的界面)

概念:BaseAdapter 是 Android 中最基础的适配器类,它是所有其他适配器(如 ArrayAdapter、SimpleAdapter)的父类。

方法签名


public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter { 
// 获取数据项总数 
public abstract int getCount(); 
// 获取指定位置的数据项
public abstract Object getItem(int position); 
// 获取指定位置的数据项 ID 
public abstract long getItemId(int position); 
// 获取视图以显示数据  包含视图复用逻辑
public abstract View getView(int position, View convertView, ViewGroup parent); 

工作流程的详细解释

1.定义一个实体类Fruit,交互的数据类型就用这个实体类。

里面只有两个字段,name表示水果的名字,imageId表示水果对应图片的资源

package com.example.test;public class Fruit {private String name;//水果名字private int imageResId;//图片ID//构造函数public Fruit(String name, int imageResId) {this.name = name;this.imageResId = imageResId;}public String getName() {return name;}public int getImageResId() {return imageResId;}}

2.自定义水果适配器FruitAdapter,继承自BaseAdapter

定义数据表,存储Fruit类的数据

private Context context;//上下文用于加载布局
private List<Fruit> fruitList = new ArrayList<>();//存储数据的列表

3.构造方法

    public FruitAdapter(Context context) {this.context = context;}

4.添加水果到列表的方法

    public void addFruit(Fruit fruit) {fruitList.add(fruit);notifyDataSetChanged(); // 通知适配器数据已更改}

5.自定义适配器的固定动作

 //1.返回条目总数@Overridepublic int getCount() {return fruitList.size();}//2. 返回指定位置的数据项@Overridepublic Object getItem(int position) {return fruitList.get(position);}//3. 返回数据项的ID(通常使用位置作为ID)@Overridepublic long getItemId(int position) {return position;}

6.getView

    // 4. 创建并返回指定位置的视图(用Fruit中的信息填充list_item的组件)//用list_item.xml渲染出条目view//用Fruit中的信息填充list_item.xml的组件@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//为 ListView 的每一行创建视图并绑定数据// 1.获取当前位置的水果数据Fruit fruit = fruitList.get(position);// 2.复用convertView以提高性能ViewHolder holder;if (convertView == null) {// 如果convertView为空(没有可复用的视图),则加载新布局// 加载列表项布局(渲染)convertView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);// 创建ViewHolder并缓存视图组件holder = new ViewHolder();holder.imageView = convertView.findViewById(R.id.imageView);holder.textView = convertView.findViewById(R.id.textView);// 将ViewHolder存储在View中convertView.setTag(holder);} else {// // 如果convertView不为空,直接从Tag中获取ViewHolderholder = (ViewHolder) convertView.getTag();}//3. 绑定数据到视图holder.imageView.setImageResource(fruit.getImageResId());holder.textView.setText(fruit.getName());return convertView;}// ViewHolder类用于缓存视图组件,提高性能private static class ViewHolder {ImageView imageView;TextView textView;}

6.

代码实例(MainActivity.java&activity_main.xml&list_item.xml&Fruit.java&FruitAdapter.java)

MainActivity.java

package com.example.test;import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 获取ListView控件ListView listView = findViewById(R.id.listView);// 创建并设置自定义适配器FruitAdapter adapter = new FruitAdapter(this);// 添加水果数据adapter.addFruit(new Fruit("苹果", R.drawable.ic_success));adapter.addFruit(new Fruit("香蕉", R.drawable.ic_success));adapter.addFruit(new Fruit("橙子", R.drawable.ic_success));adapter.addFruit(new Fruit("草莓", R.drawable.ic_success));adapter.addFruit(new Fruit("西瓜", R.drawable.ic_success));// 设置适配器到ListViewlistView.setAdapter(adapter);}
}

activity_main.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"android:padding="16dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="水果列表"android:textSize="24sp"android:layout_gravity="center_horizontal"android:layout_marginBottom="16dp"/><ListViewandroid:id="@+id/listView"android:layout_width="match_parent"android:layout_height="match_parent"/>
</LinearLayout>

list_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="wrap_content"android:orientation="horizontal"android:padding="8dp"android:gravity="center_vertical"><ImageViewandroid:id="@+id/imageView"android:layout_width="60dp"android:layout_height="60dp"android:scaleType="centerCrop"android:src="@mipmap/ic_launcher"android:layout_marginEnd="16dp"/><TextViewandroid:id="@+id/textView"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:textSize="18sp"android:textColor="#000"/>
</LinearLayout>

Fruit.java

package com.example.test;public class Fruit {private String name;private int imageResId;public Fruit(String name, int imageResId) {this.name = name;this.imageResId = imageResId;}public String getName() {return name;}public int getImageResId() {return imageResId;}}

FruitAdapter.java

package com.example.test;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;//将数据(水果列表)转换为 ListView 可以显示的视图
public class FruitAdapter extends BaseAdapter {private Context context;//上下文用于加载布局private List<Fruit> fruitList = new ArrayList<>();//存储数据的列表// 构造方法:接收上下文public FruitAdapter(Context context) {this.context = context;}// 添加水果到列表的方法public void addFruit(Fruit fruit) {fruitList.add(fruit);notifyDataSetChanged(); // 通知适配器数据已更改}//1.返回条目总数@Overridepublic int getCount() {return fruitList.size();}//2. 返回指定位置的数据项@Overridepublic Object getItem(int position) {return fruitList.get(position);}//3. 返回数据项的ID(通常使用位置作为ID)@Overridepublic long getItemId(int position) {return position;}// 4. 创建并返回指定位置的视图(用Fruit中的信息填充list_item的组件)//用list_item.xml渲染出条目view//用Fruit中的信息填充list_item.xml的组件@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//为 ListView 的每一行创建视图并绑定数据// 1.获取当前位置的水果数据Fruit fruit = fruitList.get(position);// 2.复用convertView以提高性能ViewHolder holder;if (convertView == null) {// 如果convertView为空(没有可复用的视图),则加载新布局// 加载列表项布局(渲染)convertView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);// 创建ViewHolder并缓存视图组件holder = new ViewHolder();holder.imageView = convertView.findViewById(R.id.imageView);holder.textView = convertView.findViewById(R.id.textView);// 将ViewHolder存储在View中convertView.setTag(holder);} else {// // 如果convertView不为空,直接从Tag中获取ViewHolderholder = (ViewHolder) convertView.getTag();}//3. 绑定数据到视图holder.imageView.setImageResource(fruit.getImageResId());holder.textView.setText(fruit.getName());return convertView;}// ViewHolder类用于缓存视图组件,提高性能private static class ViewHolder {ImageView imageView;TextView textView;}
}

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

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

相关文章

Conda配置完全指南:Windows系统Anaconda/Miniconda的安装、配置、基础使用、清理缓存空间和Pycharm/VSCode配置指南

本文同步发布在个人博客&#xff1a; Conda配置完全指南Conda 是一个开源的跨平台包管理与环境管理工具&#xff0c;广泛应用于数据科学、机器学习及 Python 开发领域。它不仅能帮助用户快速安装、更新和卸载第三方库&#xff0c;还能创建相互隔离的虚拟环境&#xff0c;解决不…

什么是账号矩阵?如何避免账号IP关联风险

账号矩阵是指在同一平台或多个平台上&#xff0c;围绕同一品牌、业务或个人 IP 构建的多个相互关联、协同运作的账号体系。这些账号通过差异化的内容定位和运营策略形成互补&#xff0c;共同实现流量聚合、品牌曝光或业务拓展的目标。协同效应&#xff1a;账号间通过内容互推、…

解析ELK(filebeat+logstash+elasticsearch+kibana)日志系统原理以及k8s集群日志采集过程

ELK日志系统解析 ELK 日志系统&#xff08;现常称为 Elastic Stack&#xff0c;由 Filebeat、Logstash、Elasticsearch、Kibana 组成&#xff09;是一套用于 日志收集、清洗、存储、检索和可视化 的开源解决方案。 它的核心价值是将分散在多台服务器 / 应用中的日志 “汇聚成池…

python 内置函数 sort() 复杂度分析笔记

在做 280. 摆动排序 时&#xff0c;有一版 python 题解&#xff0c;里面直接用了sort() &#xff0c;又用了一个简单的 for 循环&#xff0c;但整体时间复杂度为 O(n⋅log(n)) &#xff0c;那么问题就出自这个 sort() &#xff0c;所以在这分析一下 sort() 的复杂度。Python 的…

【光照】Unity中的[经验模型]

【从UnityURP开始探索游戏渲染】专栏-直达 图形学第一定律&#xff1a;“看起来对就对” URP光照模型发展史 ‌2018年‌&#xff1a;URP首次发布&#xff08;原LWRP&#xff09;&#xff0c;继承传统前向渲染的Blinn-Phong简化版‌2019年‌&#xff1a;URP 7.x引入Basic Shade…

uniapp小程序使用自定义底部tabbar,并根据用户类型动态切换tabbar数据

1.注意点 在pages.json中配置tabbar如下字段&#xff1a;custom&#xff1a;true &#xff0c;会自动隐藏原生tabbar&#xff0c;使用自定义的tabbar2.如何自定义呢 可以使用第三方组件库的tabbar组件&#xff0c;然后二次封装下内部封装逻辑&#xff1a; 1.点击切换逻辑 2.根据…

Redis 哨兵 (基于 Docker)

目录 1. 基本概念 2. 安装部署 (基于 Docker) 2.1 使用 docker 获取 redis 镜像 2.2 编排 主从节点 2.3 编排 redis-sentinel 节点 3. 重新选举 4. 选举原理 5. 总结 1. 基本概念 名词 逻辑结构物理结构主节点Reids 主服务一个独立的 redis-server 进程从节点Redis 从…

Python学习-day4

Python 语言的运算符: 算术运算符比较&#xff08;关系&#xff09;运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符运算符优先级 算术运算符 定义变量a 21&#xff0c;变量b 10。运算符描述实例加 - 两个对象相加a b 输出结果 31-减 - 得到负数或是一个数减去另一…

Vite 插件 @vitejs/plugin-legacy 深度解析:旧浏览器兼容指南

&#x1f4d6; 简介 vitejs/plugin-legacy 是 Vite 官方提供的兼容性插件&#xff0c;专门用于为现代浏览器构建的应用程序提供对旧版浏览器的支持。该插件通过自动生成兼容性代码和 polyfill&#xff0c;确保您的应用能够在 IE 11 等旧版浏览器中正常运行。 核心价值 向后兼…

数据质检之springboot通过yarn调用spark作业实现数据质量检测

Spring Boot 应用中通过 YARN 来调用 Spark 作业的来执行数据质检。这是一个非常经典的数据质量检测、数据优化的常用架构,将Web服务/业务处理(Spring Boot)与大数据质检(Spark on YARN)解耦。 核心架构图 首先,通过一张图来理解整个流程的架构: 整个流程的核心在于,…

SQL优化_以MySQL为例

MySQL SQL 优化详细教程与案例 1. 理解SQL执行过程 在优化之前&#xff0c;需要了解MySQL如何处理SQL查询&#xff1a; 客户端发送SQL语句到服务器服务器检查查询缓存&#xff08;MySQL 8.0已移除查询缓存&#xff09;解析器解析SQL&#xff0c;生成解析树预处理器验证权限和表…

探索数据结构中的 “树”:揭开层次关系的奥秘

在计算机科学的广袤森林中&#xff0c;有一种数据结构如同参天大树般支撑着无数应用的根基 —— 它就是 “树”&#xff08;Tree&#xff09;。它不仅仅是一个抽象概念&#xff0c;更是我们理解和组织信息、模拟现实世界层级关系的强大工具。1. 什么是 “树”&#xff1f;从家族…

技术框架之RPC

一、序言&#xff1a;为什么我们需要RPC&#xff1f;在单体应用时代&#xff0c;函数调用是进程内的简单操作。但随着业务规模扩大&#xff0c;系统被拆分为多个独立服务&#xff08;如订单服务、支付服务&#xff09;&#xff0c;服务间通信成为刚需。早期开发者常使用HTTPJSO…

【光照】Unity中的[光照模型]概念辨析

【从UnityURP开始探索游戏渲染】专栏-直达 基础光照模型‌ ‌标准光照模型&#xff08;Standard Lighting Model&#xff09;‌ ‌定义‌&#xff1a;传统光照计算的框架&#xff0c;通常包含漫反射、镜面反射和环境光三部分。‌特点‌&#xff1a;非物理经验模型&#xff0c…

MCU上跑AI—实时目标检测算法探索

MCU上跑实时目标检测算法 前几年一直忙着别的事情没有在技术分享上下功夫, 这段时间稳定下来就想和几个志同道合的朋友做点有意义的事情, 于是乎就使用MCU做了个与AI有识别相关的 “小玩意儿”. 本人负责嵌入式端相关的编码, AI相关的工作由好友 AgeWang 负责. 这儿把一些成果给…

SpringBoot 整合 RabbitMQ 的完美实践

引言: 本文总字数:约 9200 字 预计阅读时间:38 分钟 为什么 RabbitMQ 是消息中间件的优选? 在分布式系统架构中,消息中间件扮演着 "交通枢纽" 的角色,负责协调各个服务之间的通信。目前主流的消息中间件有 RabbitMQ、Kafka 和 RocketMQ,它们各具特色: Kafka…

nestjs 发起请求 axios

1、下载npm i --save nestjs/axios axios2、全局配置import { HttpModule } from nestjs/axios;Global() Module({imports: [HttpModule.registerAsync({inject: [ConfigService],useFactory: async (configService: ConfigService) > {return {timeout: configService.get(…

将 Logits 得分转换为概率,如何计算

场景&#xff1a;动物识别&#xff0c;输入一张28*28的图像&#xff0c;模型输出属于 猫、狗、鸟 哪个类型。需求&#xff1a;假设模型 ​​Logits&#xff08;模型在每个类别的置信度得分&#xff09; 输出为​​&#xff1a;[猫: 3.2, 狗: 1.5, 鸟: -0.8]。计算 ​​Softmax …

【Qt】bug排查笔记——QMetaObject::invokeMethod: No such method

问题如题目所示&#xff1a;QMetaObject::invokeMethod: No such method xxxx&#xff0c;在网上好一顿查&#xff0c;又将查到的资料喂给了 Ai&#xff0c;才最终将问题解决&#xff0c;特此记录下。 一、问题背景 在做公司项目时&#xff0c;使用了插件的方式开发。主程序加载…

Spring Boot手写10万敏感词检查程序

使用Spring Boot手写10万敏感词检查程序 本文将介绍如何使用Spring Boot构建一个高效的敏感词检查系统,能够处理多达10万个敏感词的检测需求。我们将使用DFA(Deterministic Finite Automaton)算法来实现高效匹配,并提供RESTful API接口。 实现步骤 1. 创建Spring Boot项…