首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 自定義 Dialog 中使用 ListView 完整實作指南

     編輯:程式設計綜合問答

需求場景

在自定義 Dialog 中嵌入 ListView,並用字串陣列填充數據。原始代碼已佈局 XML 並建立 Dialog,缺少 ListView 適配器綁定與數據填充邏輯。

核心步驟

  1. 在 Dialog 顯示前(或 onCreate 中)找到 ListView 引用
  2. 準備數據源(字串陣列/列表)
  3. 建立 ArrayAdapter 綁定數據與 Item 佈局
  4. 設定 Adapter 給 ListView
  5. (可選)設定 Item 點擊監聽

完整實作

1. 佈局檔 (res/layout/dialog_list.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://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/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="請選擇"
        android:textSize="18sp"
        android:gravity="center"
        android:layout_marginBottom="12dp" />

    <ListView
        android:id="@+id/lv_items"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="@android:color/darker_gray"
        android:dividerHeight="1dp" />

    <Button
        android:id="@+id/btn_cancel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="12dp"
        android:text="取消" />
</LinearLayout>

2. Activity/Kotlin 實作

class MainActivity : AppCompatActivity() {

    private val items = arrayOf("選項一", "選項二", "選項三", "選項四", "選項五")

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        findViewById

3. Java 版本對照

private void showListDialog() {
    final Dialog dialog = new Dialog(this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.dialog_list);
    dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);

    ListView listView = dialog.findViewById(R.id.lv_items);
    String[] items = {"選項一", "選項二", "選項三", "選項四", "選項五"};

    ArrayAdapter adapter = new ArrayAdapter<>(
        this,
        android.R.layout.simple_list_item_1,
        items
    );
    listView.setAdapter(adapter);

    listView.setOnItemClickListener((parent, view, position, id) -> {
        Toast.makeText(this, "選中:" + items[position], Toast.LENGTH_SHORT).show();
        dialog.dismiss();
    });

    dialog.findViewById(R.id.btn_cancel).setOnClickListener(v -> dialog.dismiss());
    dialog.show();
}

進階場景:自定義 Item 佈局

若需圖文混排、多行文字等,建立 res/layout/item_dialog_list.xml 並使用自定義 Adapter:

Item 佈局

<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="16dp"
    android:gravity="center_vertical">

    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/tv_text"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_marginStart="16dp"
        android:textSize="16sp" />
</LinearLayout>

自定義 Adapter (Kotlin)

class DialogListAdapter(
    private val context: Context,
    private val data: List // data class DialogItem(val icon: Int, val text: String)
) : BaseAdapter() {

    override fun getCount() = data.size
    override fun getItem(position: Int) = data[position]
    override fun getItemId(position: Int) = position.toLong()

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val view = convertView ?: LayoutInflater.from(context).inflate(R.layout.item_dialog_list, parent, false)
        val item = data[position]
        view.findViewById(R.id.iv_icon).setImageResource(item.icon)
        view.findViewById(R.id.tv_text).text = item.text
        return view
    }
}

Dialog vs DialogFragment:現代選擇

特性DialogDialogFragment
生命週期管理手動管理,旋轉螢幕易洩漏自動跟隨 FragmentManager,配置變更安全
返回棧支援無可加入返回棧
代碼複用較難封裝性強,易復用
推薦場景簡單、一次性彈窗複雜、需跨 Activity 復用、含表單輸入

建議:新專案優先使用 DialogFragment + RecyclerView(替代 ListView),支援更靈活的佈局與動畫。

常見坑點避坑

  • ❌ dialog.show() 前未設定 Window.FEATURE_NO_TITLE → 頂部多出標題欄空白。
  • ❌ ListView 高度撐不開 → 佈局用 wrap_content,Dialog 窗口設 WRAP_CONTENT。
  • ❌ 點擊外部區域自動關閉 → dialog.setCanceledOnTouchOutside(true)(預設 true)。
  • ❌ 記憶體洩漏 → Dialog 持有 Activity 引用,onDestroy 時調用 dismiss()。

結語

自定義 Dialog 中使用 ListView 的核心是:**Dialog 顯示前綁定 Adapter**。使用系統內建 android.R.layout.simple_list_item_1 可快速實現單行文字列表;複雜佈局則自定義 BaseAdapter。現代開發建議遷移至 DialogFragment + RecyclerView,獲得更好的生命週期安全與擴展性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved