在自定義 Dialog 中嵌入 ListView,並用字串陣列填充數據。原始代碼已佈局 XML 並建立 Dialog,缺少 ListView 適配器綁定與數據填充邏輯。
onCreate 中)找到 ListView 引用ArrayAdapter 綁定數據與 Item 佈局<?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>
class MainActivity : AppCompatActivity() {
private val items = arrayOf("選項一", "選項二", "選項三", "選項四", "選項五")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById
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();
}
若需圖文混排、多行文字等,建立 res/layout/item_dialog_list.xml 並使用自定義 Adapter:
<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>
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 | DialogFragment |
|---|---|---|
| 生命週期管理 | 手動管理,旋轉螢幕易洩漏 | 自動跟隨 FragmentManager,配置變更安全 |
| 返回棧支援 | 無 | 可加入返回棧 |
| 代碼複用 | 較難 | 封裝性強,易復用 |
| 推薦場景 | 簡單、一次性彈窗 | 複雜、需跨 Activity 復用、含表單輸入 |
建議:新專案優先使用 DialogFragment + RecyclerView(替代 ListView),支援更靈活的佈局與動畫。
dialog.show() 前未設定 Window.FEATURE_NO_TITLE → 頂部多出標題欄空白。wrap_content,Dialog 窗口設 WRAP_CONTENT。dialog.setCanceledOnTouchOutside(true)(預設 true)。onDestroy 時調用 dismiss()。自定義 Dialog 中使用 ListView 的核心是:**Dialog 顯示前綁定 Adapter**。使用系統內建 android.R.layout.simple_list_item_1 可快速實現單行文字列表;複雜佈局則自定義 BaseAdapter。現代開發建議遷移至 DialogFragment + RecyclerView,獲得更好的生命週期安全與擴展性。