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

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

具體作用

  • BaseAdapterAndroid 開發中一個非常重要的Adapter(介面卡)基類。它提供了建立自定義介面卡的基本實現,使開發者可以根據具體需求建立適用於不同檢視(如 ListView、GridView)的資料介面卡。以下是 BaseAdapter 的主要作用

    提供基本介面實現

    • BaseAdapter 實現了 ListAdapter 和 SpinnerAdapter 介面,因此適用於 ListView、GridView、Spinner 等元件

    自定義檢視

    • 允許開發者建立自定義的檢視來展示資料項,而不是使用簡單的內建檢視

    支援複雜佈局

    • 可以使用自定義佈局檔案,使每個資料項的展示更加靈活和多樣化

    資料管理

    • 負責管理資料集,並在資料發生變化時通知檢視進行更新

引數、方法解析

  • BaseAdapter(Context context, List<T> data):構造方法;BaseAdapter是一個抽象類,它必須自定義一個子類才可以例項化

    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;
    
    import java.util.List;
    
    public class MyAdapter extends BaseAdapter {
        private Context context;
        private List<String> data;
    
        // 構造方法
        public MyAdapter(Context context, List<String> data) {
            this.context = context;
            this.data = data;
        }
    
        @Override
        public int getCount() {
            return data.size(); // 返回資料項的數量
        }
    
        @Override
        public Object getItem(int position) {
            return data.get(position); // 返回指定位置的資料項
        }
    
        @Override
        public long getItemId(int position) {
            return position; // 返回資料項的 ID,通常用位置作為 ID
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                // 如果 convertView 為空,則需要建立新的檢視
                convertView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
            }
    
            // 查詢檢視中的 TextView
            TextView textView = convertView.findViewById(R.id.textView);
            
            // 設定 TextView 的文字為資料項
            textView.setText((String) getItem(position));
    
            return convertView; // 返回檢視
        }
    }
    
    //'Arrays.asList'用於將一組物件轉化為一個 List。這個方法返回一個固定大小的 List,即列表的大小不能被改變,但你可以對其進行讀寫操作
    List<String> data = Arrays.asList("Item 1", "Item 2", "Item 3");
    //例項化
    MyAdapter adapter = new MyAdapter(this, data);
    
    • 引數解析
      • context用於訪問應用的資源、佈局和其他應用環境相關的資訊。在構造方法中傳入,用於在介面卡類中使用,如在 LayoutInflater 中建立檢視時需要上下文物件
      • data資料來源包含需要在列表中顯示的資料項。在構造方法中傳入,用於在介面卡類中獲取和繫結資料
  • adapter.getCount()返回資料來源中專案的總數

  • adapter.getItem(int position):獲取指定位置的資料項

    int mItem = adapter.getItem(0);
    
    • 引數解析
      • position:要獲取的項的位置(從 0 開始的索引)
  • adapter.getItemId(int position):獲取指定位置資料項的 ID

    int mItem = adapter.getItemId(0);	// 通常返回位置本身作為 ID
    
    • 引數解析
      • position:要獲取項 ID 的位置(從 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可重用的檢視,如果該檢視不為空,則可以重用以提高效能(通常是上次使用的檢視)
      • parentListViewGridView 的父檢視,用於生成新的檢視
  • adapter.notifyDataSetChanged()通知介面卡資料已發生更改,要求檢視更新

使用環境解析

ListView

  • 用途顯示滾動的列表項,例如訊息列表聯絡人列表

  • BaseAdapter適用性:適合用來建立自定義列表項檢視將資料來源與 ListView 繫結。例如,展示自定義佈局的聯絡人資訊或產品列表

  • 示例:如果你需要顯示一個包含圖片和文字的複雜列表項,你可以使用 BaseAdapter 自定義介面卡來實現

    • 啟動類中使用它

      ListView listView = findViewById(R.id.listView);
      MyAdapter adapter = new MyAdapter(this, data);
      listView.setAdapter(adapter);
      

GridView

  • 用途:顯示網格狀的項,例如圖片庫應用圖示

  • BaseAdapter 適用性:用於顯示具有相同佈局但不同內容的網格項。例如,建立一個自定義的圖片網格

  • 示例:如果你有一個包含圖片和標題的網格BaseAdapter 可以幫助你建立自定義網格項檢視

    • 啟動類中使用它

      GridView gridView = findViewById(R.id.gridView);
      MyAdapter adapter = new MyAdapter(this, data);
      gridView.setAdapter(adapter);
      

Spinner

  • 用途顯示下拉選擇選單,例如選擇國家日期等。

  • BaseAdapter 適用性:用於自定義下拉選單項的顯示。例如,你可以自定義下拉項的佈局和資料展示方式

  • 示例如果需要在 Spinner 中顯示自定義的佈局或資料格式BaseAdapter 是一個合適的選擇

    • 啟動類中使用它

      Spinner spinner = findViewById(R.id.spinner);
      MyAdapter adapter = new MyAdapter(this, data);
      spinner.setAdapter(adapter);
      

AutoCompleteTextView

  • 用途提供自動完成的文字輸入框,例如搜尋建議或輸入提示

  • BaseAdapter 適用性自定義自動完成項的顯示方式和資料來源。例如,顯示帶有圖片和文字的搜尋建議

  • 示例如果你需要在 AutoCompleteTextView 中顯示覆雜的資料項或自定義檢視,可以使用 BaseAdapter

    • 啟動類中使用它

      AutoCompleteTextView autoCompleteTextView = findViewById(R.id.autoCompleteTextView);
      MyAdapter adapter = new MyAdapter(this, data);
      autoCompleteTextView.setAdapter(adapter);
      

總結

  • BaseAdapter 是用於建立自定義介面卡的基類,適用於多種 AdapterView,如 ListViewGridViewSpinnerAutoCompleteTextView。透過繼承 BaseAdapter 並實現其方法,你可以控制如何將資料項繫結到檢視中,從而實現靈活的資料展示和使用者介面自定義

完整程式碼示例

  • 建立啟動類佈局檔案res/layout/activity_main.xml,包含一個 ListView 控制元件

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <ListView
            android:id="@+id/listView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:dividerHeight="1dp"
            android:divider="@android:color/darker_gray"/>
    
    </RelativeLayout>
    
  • 建立佈局檔案res/layout/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/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18sp"/>
    
    </LinearLayout>
    
  • 建立一個繼承自 BaseAdapter 的自定義介面卡類MyAdapter.java

    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;
    
    import java.util.List;
    
    public class MyAdapter extends BaseAdapter {
        private Context context;
        private List<String> data;
    
        // 構造方法
        public MyAdapter(Context context, List<String> data) {
            this.context = context;
            this.data = data;
        }
    
        @Override
        public int getCount() {
            return data.size(); // 返回資料項的數量
        }
    
        @Override
        public Object getItem(int position) {
            return data.get(position); // 返回指定位置的資料項
        }
    
        @Override
        public long getItemId(int position) {
            return position; // 返回資料項的 ID,通常用位置作為 ID
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                // 如果 convertView 為空,則需要建立新的檢視
                convertView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
            }
    
            // 查詢檢視中的 TextView
            TextView textView = convertView.findViewById(R.id.textView);
            
            // 設定 TextView 的文字為資料項
            textView.setText((String) getItem(position));
    
            return convertView; // 返回檢視
        }
    }
    
  • 啟動類中使用自定義介面卡MainActivity.java,在 MainActivity例項化自定義介面卡,並將其設定到 ListView 中

    import android.os.Bundle;
    import android.widget.ListView;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import java.util.Arrays;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // 初始化資料
            List<String> data = Arrays.asList("Item 1", "Item 2", "Item 3");
    
            // 建立自定義介面卡例項
            MyAdapter adapter = new MyAdapter(this, data);
    
            // 獲取 ListView 並設定介面卡
            ListView listView = findViewById(R.id.listView);
            listView.setAdapter(adapter);
        }
    }
    
  • 執行該應用將看到一個 ListView,其中每個列表項顯示初始化資料中的字串。該應用使用 BaseAdapter 來自定義介面卡,並將其繫結到 ListView 中以顯示資料。這個示例展示瞭如何建立和使用 BaseAdapter並在實際開發中可以根據需要進行擴充套件和定製

相關文章