概念:SimpleAdapter?是 Android 中比 ArrayAdapter 更強大的適配器,用于將復雜的數據綁定到復雜的布局,支持將 Map 中的數據映射到布局中的多個 View。
方法簽名:
public SimpleAdapter(
Context context, //上下文
List<? extends Map<String, ?>> data,//數據源int resource, //列表項視圖id
String[] from,//數據鍵名int[] to //視圖id
)
上下文提供應用環境信息。
數據源的數據類型必須為List<Map<String, Object>>,每個Map
代表一個列表項的數據,String
是數據字段的key,Object
是對應的值。這里是填數據源的名字。
列表項視圖ID就是子項視圖的ID。
from 參數:指定Map中要使用的key名稱
to參數:指定布局中View的id,對應著from中的key
優點:
顯示更多信息:同時顯示設備名稱、MAC地址、信號強度
更好的用戶體驗:豐富的視覺信息
靈活的數據展示:支持文本、圖片等多種數據類型
缺點:
對于非常大量的數據,性能可能不如 RecyclerView
功能有限:不支持復雜的交互邏輯
布局限制:只能進行簡單的數據映射,不能處理復雜的布局邏輯
工作流程的詳細講解:
1.先初始化數據列
List<Map<String, Object>> data = new ArrayList<>();
2.往列表里面添加數據
根據數據列表,聲明一個Map接口類型的變量item1,指定鍵為String,值為Object。?實例化一個HashMap對象并賦值給item1變量,用于存儲鍵值對數據。用Map的put方法把數據添加進Map,再用List的add方法把這個Map對象放入List中。
Map<String, Object> item1 = new HashMap<>();item1.put("name", "蘋果");item1.put("image", R.drawable.apple);data.add(item1);Map<String, Object> item2 = new HashMap<>();item2.put("name", "香蕉");item2.put("image", R.drawable.banana);data.add(item2);Map<String, Object> item3 = new HashMap<>();item3.put("name", "橙子");item3.put("image", R.drawable.orange);data.add(item3);Map<String, Object> item4 = new HashMap<>();item4.put("name", "草莓");item4.put("image", R.drawable.strawberry);data.add(item4);
3.定義數據到視圖的映射關系
告訴適配器,數據中的"image"鍵對應布局中的圖片控件,"name"鍵對應布局中的文本控件。這樣適配器就能自動完成數據到界面的綁定。
String[] from = {"image", "name"};//from數組中的每個元素都是一個字符串,對應數據集合中 Map 的鍵。
int[] to = {R.id.imageView, R.id.textView};//to數組中的每個元素都是一個視圖 ID(整數類型),對應布局文件中的控件 ID。
4.創建SimpleAdapter
直接填寫相關參數
SimpleAdapter adapter = new SimpleAdapter(this,//上下文data,//數據R.layout.list_item,//子項視圖from,//數據鍵名to//視圖id);
5.獲取ListView并設置適配器
ListView listView = findViewById(R.id.listView);
listView.setAdapter(adapter);
代碼示例:
MainActivity.java
package com.example.test;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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 準備數據List<Map<String, Object>> data = new ArrayList<>();// 添加水果數據Map<String, Object> item1 = new HashMap<>();item1.put("name", "蘋果");item1.put("image", R.drawable.apple);data.add(item1);Map<String, Object> item2 = new HashMap<>();item2.put("name", "香蕉");item2.put("image", R.drawable.banana);data.add(item2);Map<String, Object> item3 = new HashMap<>();item3.put("name", "橙子");item3.put("image", R.drawable.orange);data.add(item3);Map<String, Object> item4 = new HashMap<>();item4.put("name", "草莓");item4.put("image", R.drawable.strawberry);data.add(item4);// 定義數據到視圖的映射關系//告訴適配器,數據中的"image"鍵對應布局中的圖片控件,"name"鍵對應布局中的文本控件。這樣適配器就能自動完成數據到界面的綁定。String[] from = {"image", "name"};//from數組中的每個元素都是一個字符串,對應數據集合中 Map 的鍵。int[] to = {R.id.imageView, R.id.textView};//to數組中的每個元素都是一個視圖 ID(整數類型),對應布局文件中的控件 ID。// 創建SimpleAdapterSimpleAdapter adapter = new SimpleAdapter(this,//上下文data,//數據R.layout.list_item,//子項視圖from,//數據鍵名to//視圖id);// 獲取ListView并設置適配器ListView listView = findViewById(R.id.listView);listView.setAdapter(adapter);}
}
activity_main.xml
<?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"android:padding="16dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="水果列表"android:textSize="24sp"android:layout_gravity="center_horizontal"android:layout_marginBottom="16dp"/><ListViewandroid:id="@+id/listView"android:layout_width="match_parent"android:layout_height="match_parent"/>
</LinearLayout>
list_item.xml
<?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="horizontal"android:padding="8dp"><ImageViewandroid:id="@+id/imageView"android:layout_width="60dp"android:layout_height="60dp"android:scaleType="centerCrop"android:paddingRight="16dp"/><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="18sp"android:layout_gravity="center_vertical"/>
</LinearLayout>