使用 ArrayAdapter 顯示 String[] 資料,需點擊項目啟動對應 Activity,但項目無 ID,不知如何建立對應關係。
繼承 ListActivity 或在 Fragment/Activity 中設定 OnItemClickListener,利用 position 參數決定跳轉目標。
public class FoodListActivity extends ListActivity {
private static final String[] FOODS = {"Salads", "Sandwiches", "Drinks"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(new ArrayAdapter<>(this, R.layout.rowlayout, R.id.label, FOODS));
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Intent intent;
switch (position) {
case 0: intent = new Intent(this, SaladActivity.class); break;
case 1: intent = new Intent(this, SandwichActivity.class); break;
case 2: intent = new Intent(this, DrinkActivity.class); break;
default: return;
}
startActivity(intent);
}
}
ListView listView = findViewById(R.id.listView);
listView.setAdapter(new ArrayAdapter<>(this, R.layout.rowlayout, R.id.label, FOODS));
listView.setOnItemClickListener((parent, view, position, id) -> {
Intent intent;
switch (position) {
case 0: intent = new Intent(this, SaladActivity.class); break;
case 1: intent = new Intent(this, SandwichActivity.class); break;
case 2: intent = new Intent(this, DrinkActivity.class); break;
default: return;
}
startActivity(intent);
});
將目標 Activity 類別與資料綁定,新增項目只需修改資料來源:
// 資料模型
data class FoodItem(val name: String, val targetActivity: Class)
private val FOODS = listOf(
FoodItem("Salads", SaladActivity::class.java),
FoodItem("Sandwiches", SandwichActivity::class.java),
FoodItem("Drinks", DrinkActivity::class.java)
)
// Adapter 只顯示 name
// 點擊時
val item = FOODS[position]
startActivity(Intent(this, item.targetActivity))
intent.putExtra("food_name", FOODS[position].name);
// 或傳遞完整物件(需實作 Parcelable/Serializable)
intent.putExtra("food_item", FOODS[position]);
position 是項目在 Adapter 中的索引(0-based),直接對應資料來源陣列/列表。position 即是隱性識別碼。switch、Map 或資料模型綁定目標,避免散落的 if-else。掌握 position 與資料來源的對應關係,是 ListView/RecyclerView 點擊跳轉的核心功力。