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

发布于:2025-08-30 ⋅ 阅读:(22) ⋅ 点赞:(0)

概念: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.返回条目总数
    @Override
    public int getCount() {
        return fruitList.size();
    }

    //2. 返回指定位置的数据项
    @Override
    public Object getItem(int position) {
        return fruitList.get(position);
    }

    //3. 返回数据项的ID(通常使用位置作为ID)
    @Override
    public long getItemId(int position) {
        return position;
    }

6.getView

    // 4. 创建并返回指定位置的视图(用Fruit中的信息填充list_item的组件)
    //用list_item.xml渲染出条目view
     //用Fruit中的信息填充list_item.xml的组件
    @Override
    public 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中获取ViewHolder
            holder = (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 {

    @Override
    protected 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));

        // 设置适配器到ListView
        listView.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">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="水果列表"
        android:textSize="24sp"
        android:layout_gravity="center_horizontal"
        android:layout_marginBottom="16dp"/>

    <ListView
        android: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">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:scaleType="centerCrop"
        android:src="@mipmap/ic_launcher"
        android:layout_marginEnd="16dp"/>

    <TextView
        android: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.返回条目总数
    @Override
    public int getCount() {
        return fruitList.size();
    }

    //2. 返回指定位置的数据项
    @Override
    public Object getItem(int position) {
        return fruitList.get(position);
    }

    //3. 返回数据项的ID(通常使用位置作为ID)
    @Override
    public long getItemId(int position) {
        return position;
    }

    // 4. 创建并返回指定位置的视图(用Fruit中的信息填充list_item的组件)
    //用list_item.xml渲染出条目view
     //用Fruit中的信息填充list_item.xml的组件
    @Override
    public 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中获取ViewHolder
            holder = (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;
    }
}