Android开发 - (适配器)Adapter类中SimpleAdapter实现类详细解析
简介
- 用于将静态数据绑定到 ListView 或 GridView,支持更复杂的布局
具体作用
- SimpleAdapter 的主要作用是简化将数据源(如 List<Map<String, Object>>)绑定到视图组件(如 TextView、ImageView 等)的过程。它可以根据指定的键将数据映射到指定的视图组件上,从而快速实现数据的展示
参数、方法解析
-
SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
:构造方法List<Map<String, String>> data = new ArrayList<Map<String, String>>(); Map<String, String> item1 = new HashMap<String, String>(); item.put("text1", "Item 1"); item.put("text2", "Description 1"); data.add(item); String[] from = {"text1", "text2"}; int[] to = {R.id.text1, R.id.text2}; SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.list_item, from, to);
- 参数解析:
- context:上下文对象,通常是 Activity 或 Application 的对象
- data:数据源,通常是一个
List<Map<String, ?>>
,每个 Map 对象代表列表中的一行数据 - resource:列表项布局文件的资源 ID
- from:一个字符串数组,指定 Map 对象中与视图组件绑定的数据的键
- to:一个整型数组,指定绑定数据的视图组件的 ID
- 参数解析:
-
adapter.getCount()
:得到适配器中数据项的数量,也就是 data 列表的大小 -
adapter.getItem(int position)
:得到指定位置的数据项。该数据项是 data 列表中的一个 Map 对象Object item = adapter.getItem(0);
- 参数解析:
- position:数据项的位置(索引),从 0 开始
- 参数解析:
-
adapter.getItemId(int position)
:得到指定位置的数据项的 ID。这里简单地返回位置索引int item = adapter.getItemId(0);
- 参数解析:
- position:数据项的位置(索引),从 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.setViewBinder(SimpleAdapter.ViewBinder viewBinder)
:// 自定义视图绑定器:在这个示例中,data 是一个 Long 类型的时间戳。通过检查 data 的类型,我们将其转换为特定格式的日期字符串 adapter.setViewBinder(new SimpleAdapter.ViewBinder() { @Override public boolean setViewValue(View view, Object data, String textRepresentation) { if (view instanceof TextView && data instanceof Long) { // 将时间戳转换为日期字符串 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault()); ((TextView) view).setText(dateFormat.format(new Date((Long) data))); return true; } else if (view instanceof TextView) { ((TextView) view).setText(textRepresentation); return true; } return false; } });
- 参数解析:
- viewBinder:实现了
SimpleAdapter.ViewBinder
接口的对象,用于自定义数据和视图的绑定逻辑。可以通过自定义绑定逻辑来处理复杂的数据绑定需求
- viewBinder:实现了
setViewValue(View view, Object data, String textRepresentation)
:- 参数解析:
- view:要绑定数据的视图
- data:绑定到视图的数据
- textRepresentation:数据的字符串表示形式
- 参数解析:
- 参数解析:
-
getViewBinder()
:得到当前的视图绑定器(viewBinder
)
使用场景解析
-
SimpleAdapter 是 Android 提供的一个简单的适配器类,用于将数据映射到视图组件上。它非常适合在以下场景中使用:
简单的数据绑定
-
当你有一个简单的数据结构,并且需要将这些数据绑定到一个列表项布局时,SimpleAdapter 是非常方便的选择。例如,你有一个包含字符串和整数的列表,并且需要将这些数据展示在 ListView 中:
List<Map<String, String>> data = new ArrayList<Map<String, String>>(); Map<String, String> item = new HashMap<String, String>(); item.put("title", "Title 1"); item.put("description", "Description 1"); data.add(item); item = new HashMap<String, String>(); item.put("title", "Title 2"); item.put("description", "Description 2"); data.add(item); String[] from = {"title", "description"}; int[] to = {R.id.titleTextView, R.id.descriptionTextView}; SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.list_item, from, to); ListView listView = findViewById(R.id.listView); listView.setAdapter(adapter);
静态数据
-
当数据是静态的或在运行时不会频繁更新时,SimpleAdapter 可以快速而简单地实现数据绑定。例如,一个静态的菜单列表,或者一个固定的设置选项列表
-
静态数据列表示例:
List<Map<String, String>> data = new ArrayList<>(); String[] titles = {"Home", "Profile", "Settings", "Logout"}; for (String title : titles) { Map<String, String> item = new HashMap<>(); item.put("title", title); data.add(item); } String[] from = {"title"}; int[] to = {R.id.titleTextView}; SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.list_item, from, to); ListView listView = findViewById(R.id.listView); listView.setAdapter(adapter);
原型开发
- 在原型开发或快速迭代阶段,使用 SimpleAdapter 可以迅速搭建一个数据展示的界面,而不需要编写大量的自定义适配器代码
演示和教学
-
在进行演示或教学时,使用 SimpleAdapter 可以清晰地展示数据绑定的基本原理,而不需要复杂的代码示例
-
演示用途示例
List<Map<String, Object>> data = new ArrayList<<Map<String, Object>>>(); Map<String, Object> item = new HashMap<String, Object>(); item.put("image", R.drawable.ic_launcher); item.put("title", "Title 1"); item.put("description", "Description 1"); data.add(item); item = new HashMap<String, Object>(); item.put("image", R.drawable.ic_launcher); item.put("title", "Title 2"); item.put("description", "Description 2"); data.add(item); String[] from = {"image", "title", "description"}; int[] to = {R.id.imageView, R.id.titleTextView, R.id.descriptionTextView}; SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.list_item, from, to); ListView listView = findViewById(R.id.listView); listView.setAdapter(adapter);
少量数据项
-
当数据项的数量较少,并且布局相对简单时,SimpleAdapter 可以减少开发时间和复杂度。例如,一个包含几个选项的简单列表
-
少量数据项示例:
List<Map<String, String>> data = new ArrayList<<Map<String, String>>>(); Map<String, String> item1 = new HashMap<String, String>(); item1.put("name", "Alice"); item1.put("age", "25"); data.add(item1); Map<String, String> item2 = new HashMap<String, String>(); item2.put("name", "Bob"); item2.put("age", "30"); data.add(item2); String[] from = {"name", "age"}; int[] to = {R.id.nameTextView, R.id.ageTextView}; SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.list_item, from, to); ListView listView = findViewById(R.id.listView); listView.setAdapter(adapter);
结论
- SimpleAdapter 是一个非常方便的适配器类,适合在简单的数据绑定场景中使用。它能够快速、简洁地将数据映射到视图上,特别适用于静态数据、少量数据项、原型开发、演示和教学等场景
-
完整代码示例
-
在
res/layout
目录下创建两个布局文件:启动类布局文件、列表项布局文件-
activity_main.xml
(启动类布局文件):定义了一个 ListView,用于显示列表项<?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"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
-
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/titleTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" android:textColor="@android:color/black" /> <TextView android:id="@+id/descriptionTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="14sp" android:textColor="@android:color/darker_gray" /> </LinearLayout>
-
-
在 src 目录下创建一个新的启动类
MainActivity.java
。在这个类中初始化数据并使用 SimpleAdapter 将数据绑定到 ListViewpackage com.example.simpleadapterexample; import android.os.Bundle; import android.widget.ListView; import android.widget.SimpleAdapter; import androidx.appcompat.app.AppCompatActivity; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MainActivity extends AppCompatActivity { //在 onCreate 方法中初始化数据。数据被存储在一个 List<Map<String, String>> 中 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化数据 List<Map<String, String>> data = new ArrayList<>(); //每个 Map 对象代表一个列表项 Map<String, String> item1 = new HashMap<>(); item1.put("title", "Title 1"); item1.put("description", "Description 1"); data.add(item1); Map<String, String> item2 = new HashMap<>(); item2.put("title", "Title 2"); item2.put("description", "Description 2"); data.add(item2); Map<String, String> item3 = new HashMap<>(); item3.put("title", "Title 3"); item3.put("description", "Description 3"); data.add(item3); // 创建 SimpleAdapter 实例 String[] from = {"title", "description"}; int[] to = {R.id.titleTextView, R.id.descriptionTextView}; //使用 SimpleAdapter 将数据绑定到列表项布局上。构造 SimpleAdapter 实例时,传入上下文、数据源、列表项布局资源 ID、数据键数组和视图 ID 数组 SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.list_item, from, to); // 获取 ListView 并设置适配器 ListView listView = findViewById(R.id.listView); //将 SimpleAdapter 设置为 ListView 的适配器,以显示数据 listView.setAdapter(adapter); } }
-
运行该应用将会看到一个包含三项的列表,每项显示一个标题和描述。这个案例展示了如何使用 SimpleAdapter 快速将数据绑定到视图组件上,适合用于展示简单的数据结构