原代碼在 `onItemLongClick` 中正確獲取了姓名和電話,但變量 `dh` 定義為局部變量,導致 `onContextItemSelected` 中引用的是類成員數組 `dh[]` 而非選中的具體號碼。解決方案是**將選中的電話號碼存入類成員變量**,供上下文菜單回調使用。
public class M1 extends Activity {
private ListView lv1;
private String[] names = {"張三", "李四", "王五", "趙六"};
private String[] phones = {"626746", "624882", "620874", "130533"};
private String selectedPhone = ""; // 新增:存儲長按選中的電話
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.m1);
lv1 = findViewById(R.id.lv1);
List<Map<String, Object>> data = new ArrayList<>();
for (int i = 0; i < names.length; i++) {
Map<String, Object> item = new HashMap<>();
item.put("pic", pics[i]);
item.put("name", names[i]);
item.put("phone", phones[i]);
data.add(item);
}
SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.moban,
new String[]{"pic", "name", "phone"},
new int[]{R.id.iv1, R.id.tv1, R.id.tv2});
lv1.setAdapter(adapter);
lv1.setOnItemLongClickListener((parent, view, position, id) -> {
Map<String, Object> item = (Map<String, Object>)
lv1.getItemAtPosition(position);
selectedPhone = (String) item.get("phone"); // 關鍵:保存到成員變量
String name = (String) item.get("name");
Toast.makeText(this, "長按: " + name + " - " + selectedPhone, Toast.LENGTH_SHORT).show();
return false; // 返回 false 允許上下文菜單彈出
});
registerForContextMenu(lv1);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.m1, menu);
menu.setHeaderTitle("請選擇操作");
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
if (selectedPhone.isEmpty()) return super.onContextItemSelected(item);
Intent intent = new Intent();
switch (item.getItemId()) {
case R.id.dh: // 撥打電話
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + selectedPhone));
// 需權限:
startActivity(intent);
break;
case R.id.dx: // 發送短信
intent.setAction(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("smsto:" + selectedPhone));
intent.putExtra("sms_body", "");
startActivity(intent);
break;
}
return super.onContextItemSelected(item);
}
}
ListView 已過時,新項目建議使用 `RecyclerView` + `ItemTouchHelper` 或 `OnLongClickListener` 實現更靈活的交互。數據綁定邏輯同理:長按時在 ViewHolder 或 Adapter 回調中獲取對應位置數據,存入 Activity/Fragment 成員變量或通過接口回調傳遞給菜單處理邏輯。