簡介
- 用於將靜態資料繫結到 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 { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化資料 List<Map<String, String>> data = new ArrayList<>(); 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 adapter = new SimpleAdapter(this, data, R.layout.list_item, from, to); // 獲取 ListView 並設定介面卡 ListView listView = findViewById(R.id.listView); listView.setAdapter(adapter); } }
-
執行該應用將會看到一個包含三項的列表,每項顯示一個標題和描述。這個案例展示了如何使用 SimpleAdapter 快速將資料繫結到檢視元件上,適合用於展示簡單的資料結構