核心介面
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
// 1. 從適配器獲取資料
MyItem item = (MyItem) parent.getAdapter().getItem(position);
String fileName = item.getFileName();
// 2. 彈出操作對話框 (推薦 DialogFragment)
MyDialogFragment dialog = MyDialogFragment.newInstance(fileName);
dialog.show(getSupportFragmentManager(), "action_dialog");
}
});
DialogFragment 封裝傳值
public class MyDialogFragment extends DialogFragment {
private static final String ARG_FILE = "arg_file";
static MyDialogFragment newInstance(String fileName) {
Bundle args = new Bundle();
args.putString(ARG_FILE, fileName);
MyDialogFragment f = new MyDialogFragment();
f.setArguments(args);
return f;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
String fileName = getArguments().getString(ARG_FILE);
return new AlertDialog.Builder(requireContext())
.setTitle("操作: " + fileName)
.setItems(new String[]{"查看", "編輯", "刪除"}, (d, which) -> {
// 處理各操作
})
.create();
}
}
替代方案:RecyclerView (現代替代 ListView)
recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(context, (view, position) -> {
MyItem item = adapter.getItem(position);
// 同樣彈出 DialogFragment
}));
關鍵點總結
OnItemClickListener 參數 position 直接對應適配器索引。
- 資料模型
MyItem 應實作 Serializable 或 Parcelable 以便 Bundle 傳遞。
- 使用
DialogFragment 而非 AlertDialog.Builder 直接 show,可自動處理配置變更 (旋轉螢幕) 時的生命週期。