Android開發 - (介面卡)Adapter類中SimpleAdapter實現類詳細解析

阿俊学JAVA發表於2024-08-01

簡介

  • 用於將靜態資料繫結到 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上下文物件,通常是 ActivityApplication 的例項
      • 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 介面的物件,用於自定義資料和檢視的繫結邏輯。可以透過自定義繫結邏輯來處理複雜的資料繫結需求
    • setViewValue(View view, Object data, String textRepresentation)
      • 引數解析
        • view:要繫結資料的檢視
        • data繫結到檢視的資料
        • textRepresentation資料的字串表示形式
  • getViewBinder():得到當前的檢視繫結器(viewBinder

使用場景解析

  • SimpleAdapterAndroid 提供的一個簡單的介面卡類,用於將資料對映到檢視元件上。它非常適合在以下場景中使用:

    簡單的資料繫結

    • 當你有一個簡單的資料結構,並且需要將這些資料繫結到一個列表項佈局時,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 將資料繫結到 ListView

    package 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 快速將資料繫結到檢視元件上適合用於展示簡單的資料結構

相關文章