当前位置: 首页 > news >正文

安卓开发---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.dtcms.com/a/357224.html

相关文章:

  • 基于SpringBoot和Thymeleaf开发的英语学习网站
  • 笔记本电脑频繁出现 vcomp140.dll丢失怎么办?结合移动设备特性,提供适配性强的修复方案
  • C#连接SQL-Server数据库超详细讲解以及防SQL注入
  • LSTM实战:回归 - 实现交通流预测
  • 保护海外服务器免受黑客攻击的方法
  • WebSocket功能完整解析
  • Linux系统——EXT2 文件系统
  • 【论文阅读】Sparse4D v2:Recurrent Temporal Fusion with Sparse Model
  • HTML 和 JavaScript 关联的基础教程
  • Emeditor 提取IP地址正则表达式
  • 音视频直播卡顿分析与优化:技术原理、实践案例与未来趋势
  • 如何使用 Graylog 连接 Easysearch
  • vue3+wangEditor实现富文本编辑器
  • 【黑客技术零基础入门】黑客入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
  • Java面试现场:Spring Boot+Redis+MySQL在电商场景下的技术深度剖析
  • 机器学习复习
  • 使用 C# 复制 Word 文档内容 - 页面、节、段落、表格、页眉页脚等
  • 对接连连支付(八)-- 支付订单关闭
  • 52-容器总结与应用
  • LeetCode259~282题解
  • 使用STM32CubeMX使用CAN驱动无刷电机DJI3508
  • 多智能体框架(下)
  • 【系列03】端侧AI:构建与部署高效的本地化AI模型 第2章:端侧AI硬件入门
  • c++ 右值引用
  • 从零开始的python学习——常量与变量
  • 【STM32外设】ADC
  • OSS Nginx 反代提示 SignatureDoesNotMatch
  • 网络_协议
  • (十)ps识别:Swin Transformer-T 与 ResNet50 结合的 PS 痕迹识别模型训练过程解析
  • 链表有环找入口节点原理