Android开发 - (适配器)Adapter类中BaseAdapter实现类详细解析
简介
- 提供自定义 Adapter 的基本实现,是其他自定义 Adapter 的基类
具体作用
-
BaseAdapter 是 Android 开发中一个非常重要的Adapter(适配器)基类。它提供了创建自定义适配器的基本实现,使开发者可以根据具体需求创建适用于不同视图(如 ListView、GridView)的数据适配器。以下是 BaseAdapter 的主要作用:
提供基本接口实现
- BaseAdapter 实现了 ListAdapter 和 SpinnerAdapter 接口,因此适用于 ListView、GridView、Spinner 等组件
自定义视图:
- 允许开发者创建自定义的视图来展示数据项,而不是使用简单的内置视图
支持复杂布局:
- 可以使用自定义布局文件,使每个数据项的展示更加灵活和多样化
数据管理:
- 负责管理数据集,并在数据发生变化时通知视图进行更新
参数、方法解析
-
BaseAdapter(Context context, List<T> data)
:构造方法;BaseAdapter是一个抽象类,它必须自定义一个子类才可以实例化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.List; public class MyAdapter extends BaseAdapter { private Context context; private List<String> data; // 构造方法 public MyAdapter(Context context, List<String> data) { this.context = context; this.data = data; } @Override public int getCount() { return data.size(); // 返回数据项的数量 } @Override public Object getItem(int position) { return data.get(position); // 返回指定位置的数据项 } @Override public long getItemId(int position) { return position; // 返回数据项的 ID,通常用位置作为 ID } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { // 如果 convertView 为空,则需要创建新的视图 convertView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false); } // 查找视图中的 TextView TextView textView = convertView.findViewById(R.id.textView); // 设置 TextView 的文本为数据项 textView.setText((String) getItem(position)); return convertView; // 返回视图 } } //'Arrays.asList'用于将一组对象转化为一个 List。这个方法返回一个固定大小的 List,即列表的大小不能被改变,但你可以对其进行读写操作 List<String> data = Arrays.asList("Item 1", "Item 2", "Item 3"); //实例化 MyAdapter adapter = new MyAdapter(this, data);
- 参数解析:
- context:用于访问应用的资源、布局和其他应用环境相关的信息。在构造方法中传入,用于在适配器类中使用,如在 LayoutInflater 中创建视图时需要上下文对象
- data:数据源,包含需要在列表中显示的数据项。在构造方法中传入,用于在适配器类中获取和绑定数据
- 参数解析:
-
adapter.getCount()
:返回数据源中项目的总数 -
adapter.getItem(int position)
:获取指定位置的数据项int mItem = adapter.getItem(0);
- 参数解析:
- position:要获取的项的位置(从 0 开始的索引)
- 参数解析:
-
adapter.getItemId(int position)
:获取指定位置数据项的 IDint mItem = adapter.getItemId(0); // 通常返回位置本身作为 ID
- 参数解析:
- position:要获取项 ID 的位置(从 0 开始的索引)
- 参数解析:
-
adapter.getView(int position, View convertView, ViewGroup parent)
:创建并返回一个表示数据项的视图ListView listView = view.findViewById(android.R.id.listView_1); View view = adapter.getView(0, null, listView);
- 参数解析:
- position:要显示的数据项的位置(从 0 开始的索引)
- convertView:可重用的视图,如果该视图不为空,则可以重用以提高性能(通常是上次使用的视图)
- parent:ListView 或 GridView 的父视图,用于生成新的视图
- 参数解析:
-
adapter.notifyDataSetChanged()
:通知适配器数据已发生更改,要求视图更新
使用环境解析
ListView
-
用途:显示滚动的列表项,例如消息列表、联系人列表等
-
BaseAdapter适用性:适合用来创建自定义列表项视图,将数据源与 ListView 绑定。例如,展示自定义布局的联系人信息或产品列表
-
示例:如果你需要显示一个包含图片和文字的复杂列表项,你可以使用 BaseAdapter 自定义适配器来实现
-
启动类中使用它
ListView listView = findViewById(R.id.listView); MyAdapter adapter = new MyAdapter(this, data); listView.setAdapter(adapter);
-
GridView
-
用途:显示网格状的项,例如图片库、应用图标等
-
BaseAdapter 适用性:用于显示具有相同布局但不同内容的网格项。例如,创建一个自定义的图片网格
-
示例:如果你有一个包含图片和标题的网格,BaseAdapter 可以帮助你创建自定义网格项视图
-
启动类中使用它
GridView gridView = findViewById(R.id.gridView); MyAdapter adapter = new MyAdapter(this, data); gridView.setAdapter(adapter);
-
Spinner
-
用途:显示下拉选择菜单,例如选择国家、日期等。
-
BaseAdapter 适用性:用于自定义下拉列表项的显示。例如,你可以自定义下拉项的布局和数据展示方式
-
示例:如果需要在 Spinner 中显示自定义的布局或数据格式,BaseAdapter 是一个合适的选择
-
启动类中使用它
Spinner spinner = findViewById(R.id.spinner); MyAdapter adapter = new MyAdapter(this, data); spinner.setAdapter(adapter);
-
AutoCompleteTextView
-
用途:提供自动完成的文本输入框,例如搜索建议或输入提示
-
BaseAdapter 适用性:自定义自动完成项的显示方式和数据源。例如,显示带有图片和文字的搜索建议
-
示例:如果你需要在 AutoCompleteTextView 中显示复杂的数据项或自定义视图,可以使用 BaseAdapter
-
启动类中使用它
AutoCompleteTextView autoCompleteTextView = findViewById(R.id.autoCompleteTextView); MyAdapter adapter = new MyAdapter(this, data); autoCompleteTextView.setAdapter(adapter);
-
总结
- BaseAdapter 是用于创建自定义适配器的基类,适用于多种 AdapterView,如 ListView、GridView、Spinner 和 AutoCompleteTextView。通过继承 BaseAdapter 并实现其方法,你可以控制如何将数据项绑定到视图中,从而实现灵活的数据展示和用户界面自定义。
完整代码示例
-
创建启动类布局文件
res/layout/activity_main.xml
,包含一个 ListView 控件<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" android:dividerHeight="1dp" android:divider="@android:color/darker_gray"/> </RelativeLayout>
-
创建布局文件
res/layout/list_item.xml
,包含一个 TextView控件<?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="vertical" android:padding="16dp"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp"/> </LinearLayout>
-
创建一个继承自 BaseAdapter 的自定义适配器类:
MyAdapter.java
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.List; public class MyAdapter extends BaseAdapter { private Context context; private List<String> data; // 构造方法 public MyAdapter(Context context, List<String> data) { this.context = context; this.data = data; } @Override public int getCount() { return data.size(); // 返回数据项的数量 } @Override public Object getItem(int position) { return data.get(position); // 返回指定位置的数据项 } @Override public long getItemId(int position) { return position; // 返回数据项的 ID,通常用位置作为 ID } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { // 如果 convertView 为空,则需要创建新的视图 convertView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false); } // 查找视图中的 TextView TextView textView = convertView.findViewById(R.id.textView); // 设置 TextView 的文本为数据项 textView.setText((String) getItem(position)); return convertView; // 返回视图 } }
-
在启动类中使用自定义适配器
MainActivity.java
,在 MainActivity 中实例化自定义适配器,并将其设置到 ListView 中import android.os.Bundle; import android.widget.ListView; import androidx.appcompat.app.AppCompatActivity; import java.util.Arrays; import java.util.List; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化数据 List<String> data = Arrays.asList("Item 1", "Item 2", "Item 3"); // 创建自定义适配器MyAdapter MyAdapter adapter = new MyAdapter(this, data); // 获取 ListView 并设置适配器 ListView listView = findViewById(R.id.listView); listView.setAdapter(adapter); } }
-
运行该应用将看到一个 ListView,其中每个列表项显示初始化数据中的字符串。该应用使用 BaseAdapter 来自定义适配器,并将其绑定到 ListView 中以显示数据。这个示例展示了如何创建和使用 BaseAdapter,并在实际开发中可以根据需要进行扩展和定制