作用
- 将数组数据映射到 UI 组件(如 ListView、Spinner 等)上的角色。它是 BaseAdapter 的一个子类,专门用于处理简单的数据集合,如数组或列表。ArrayAdapter 简化了数据到视图映射的过程,使得开发者能够以更少的代码实现数据的展示。它的主要作用为以下几点:
- 数据绑定:它能够将一组数据(如字符串数组、整数数组或任何对象的数组)绑定到列表视图(ListView)或下拉列表(Spinner)等组件上。这意味着你可以通过更改适配器中的数据来更新 UI 组件的显示内容
- 视图管理:ArrayAdapter 负责为每个数据项创建或重用视图(View)。当列表项需要显示时,适配器会从已经存在的视图池中查找可重用的视图,如果找不到,则使用提供的布局资源来创建新的视图。这样做可以提高列表的滚动性能,因为创建和销毁视图是昂贵的操作
- 数据更新:当数据集合发生变化时(例如,添加、删除或修改数据项),你可以通知适配器(通过调用
notifyDataSetChanged()
方法),然后适配器会更新与之关联的 UI 组件,以反映这些更改。 - 类型安全:虽然 ArrayAdapter 可以处理任何类型的对象数组,但最好使用泛型版本的
ArrayAdapter<T>
来确保类型安全。这有助于避免在编译时期出现类型相关的错误 - 自定义视图:你可以通过提供自定义的布局资源来定义每个列表项的外观。这个布局资源应该包含一个或多个视图(如 TextView、ImageView 等),并且你需要指定哪个视图应该用于显示数据。
- 简单性和易用性:对于简单的数据列表,ArrayAdapter 提供了一种快速且简单的方法来将它们显示在 UI 上,而无需编写大量的适配器代码。这使得开发者能够更专注于应用程序的其他方面。
参数、方法解析
-
ArrayAdapter(Context context, int resource, T[] objects)
:基本构造方法;这个构造方法适用于当你有一个数组,并且想要将其内容展示在列表视图中时使用String[] items = {"Item 1", "Item 2", "Item 3", "Item 4", "Item 5"}; ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, mList);
- 参数解析:
- context:上下文对象,通常为Activity或Fragment的上下文
- resource:表示每个数据项的布局资源文件ID,例如
android.R.layout.simple_list_item_1
- objects:一个数组,包含要适配到视图中的数据
- 参数解析:
-
ArrayAdapter(Context context, int resource, List<T> objects)
:List构造方法;这个构造方法允许你使用一个 List 集合来初始化适配器,这在数据可能发生变化时非常有用,因为你可以直接修改 List 集合来更新视图List<Fragment> mList = new ArrayList<Fragment>(); mList.add("Item 1"); mList.add("Item 2"); ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, mList);
- 参数解析:
- context:上下文对象,通常为Activity或Fragment的上下文
- resource:表示每个数据项的布局资源文件ID,例如
android.R.layout.simple_list_item_1
- objects:一个 List 集合,包含要适配到视图中的数据
- 参数解析:
-
ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)
:带有布局和 TextView ID 的基本构造方法;这个构造方法提供了更高的灵活性,允许你使用数组初始化适配器后指定数据应该被填充到布局中的哪个具体的 TextView 控件中String[] items = {"Item 1", "Item 2", "Item 3", "Item 4", "Item 5"}; ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, R.id.textView_1, mList);
- 参数解析:
- context:上下文对象,通常为Activity或Fragment的上下文
- resource:表示每个数据项的布局资源文件ID,例如
android.R.layout.simple_list_item_1
- textViewResourceId:在 resource 指定的布局文件中,用于显示数据的 TextView 的 ID。这个参数允许你指定数据应该被填充到布局中的哪个 TextView 控件中;例如
R.id.textView_1
- objects:一个数组,包含要适配到视图中的数据。
- 参数解析:
-
ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)
:带有布局和 TextView ID 的List构造方法;这个构造方法提供了更高的灵活性,允许你使用List 集合初始化适配器后指定数据应该被填充到布局中的哪个具体的 TextView 控件中List<Fragment> mList = new ArrayList<Fragment>(); mList.add("Item 1"); mList.add("Item 2"); ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, R.id.textView_1, mList);
- 参数解析:
- context:上下文对象,通常为Activity或Fragment的上下文
- resource:表示每个数据项的布局资源文件ID,例如
android.R.layout.simple_list_item_1
- textViewResourceId:在 resource 指定的布局文件中,用于显示数据的 TextView 的 ID。这个参数允许你指定数据应该被填充到布局中的哪个 TextView 控件中;例如
R.id.textView_1
- objects:一个 List 集合,包含要适配到视图中的数据
- 参数解析:
-
adapter.add(T object);
:ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1); adapter.add("Item 1");
- 参数解析:
- object:向适配器中添加一个数据项
- 参数解析:
-
adapter.addAll(Collection<? extends T> collection);
:ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1); List<String> dataList = new ArrayList<String>(); dataList.add("Item 1"); dataList.add("Item 2"); adapter.addAll(dataList);
- 参数解析:
- collection:向适配器中添加一个集合的数据项
- 参数解析:
-
adapter.clear();
:清空适配器中的所有数据项 -
int count = adapter.getCount();
:获取适配器中数据项的数量 -
String item = adapter.getItem(int position);
:- 参数解析:
- position:获取指定位置的数据项
- 参数解析:
-
View view = adapter.getView(int position, View convertView, ViewGroup parent)
:获取数据项的视图,用于在ListView或Spinner中显示数据。这个方法通常不需要直接调用,而是由系统在需要显示列表项时自动调用ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1); View view = adapter.getView(position, null, listView);
-
参数解析:
-
position:要获取视图的数据项的位置(索引)
-
convertView:可复用的视图对象,用于优化列表性能,如果为null,表示要获取一个新的视图对象;如果不为null,则可以重复使用该视图对象,避免重复创建
-
parent:父视图,即该视图将被添加到的父容器(例如ListView)
-
-
-
adapter.notifyDataSetChanged();
:当数据发生变化时,可以通过适配器的方法进行更新,然后通知列表重新显示更新后的数据adapter.add("New Item"); adapter.notifyDataSetChanged();
代码实例
-
创建自定义类,例如:Item.java,它包含了列表项的文本和图标资源 ID:
public class Item { private String text; //文本 private int iconResId; //视图资源Id public Item(String text, int iconResId) { this.text = text; this.iconResId = iconResId; } public String getText() { return text; } public int getIconResId() { return iconResId; } }
-
在启动类中实操如下:准备一个包含 Item 对象的数据集合作为数据源
List<Item> itemList = new ArrayList<Item>(); //创建自定义类'Item'的 ArrayList 类(纯文本列表可以省略) //定义数据源 itemList.add(new Item("Apple", R.drawable.apple)); itemList.add(new Item("Banana", R.drawable.banana)); itemList.add(new Item("Cherry", R.drawable.cherry)); itemList.add(new Item("Date", R.drawable.date)); itemList.add(new Item("Grape", R.drawable.grape)); //纯文本列表:itemList.add("Grape");
-
创建一个自定义的 ArrayAdapter 实例,用来管理 Item 对象的数据集合:
ArrayAdapter<Item> adapter = new ArrayAdapter<Item>( this, R.layout.item_listview, // 自定义的列表项布局文件,它包含一个 ImageView 和一个 TextView 用于显示 Item 对象的文本和图标(纯文本列表可以省略 ImageView 布局) itemList) { //在 ArrayAdapter 的匿名子类中重写了 getView 方法,以便自定义每个列表项的显示内容(纯文本列表可以省略,它会自动调用) @Override public View getView(int position, View convertView, ViewGroup parent) { // 重写getView方法以便自定义显示列表项 if (convertView == null) { //null,表示要获取一个新的视图对象 convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_listview, parent, false); } ImageView iconImageView = convertView.findViewById(R.id.iconImageView); TextView textView = convertView.findViewById(R.id.textView); Item item = getItem(position); if (item != null) { //不为null,则可以重复使用该视图对象,避免重复创建 iconImageView.setImageResource(item.getIconResId()); textView.setText(item.getText()); } return convertView; } };
-
创建一个自定义的列表项布局文件
item_listview.xml
,用来显示每个 Item 对象的文本和图标:在布局文件中,我们使用了一个 ImageView 来显示图标,一个 TextView 来显示文本内容(纯文本列表可以省略 ImageView 布局)<!-- item_listview.xml --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp"> <ImageView android:id="@+id/iconImageView" android:layout_width="48dp" android:layout_height="48dp" android:layout_marginEnd="16dp" android:src="@drawable/ic_launcher_foreground" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" android:text="Item Text" /> </LinearLayout>
-
将创建的适配器绑定到 ListView 控件上:
ListView listView = findViewById(R.id.listView); listView.setAdapter(adapter);
-
通过以上步骤,我们创建了一个带有自定义视图的 ArrayAdapter,它显示了每个 Item 对象的文本和图标。当 ListView 显示时,ArrayAdapter 将根据数据源中的 Item 对象动态创建或重用视图,并将相应的文本和图标显示在列表项中