深入解析:安卓开发---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 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
list_item.xml
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 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;
}
}