具體作用
-
BaseAdapter 是 Android 開發中一個非常重要的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)
:獲取指定位置資料項的 IDint 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:可重用的檢視,如果該檢視不為空,則可以重用以提高效能(通常是上次使用的檢視)
- parent:ListView 或 GridView 的父檢視,用於生成新的檢視
- 引數解析:
-
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,如 ListView、GridView、Spinner 和 AutoCompleteTextView。透過繼承 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,並在實際開發中可以根據需要進行擴充套件和定製