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

Android GridView 項目點擊傳參至通用頁面,二級按鈕依參數導航

     編輯:程式設計綜合問答

場景描述

第一頁(GridView)含 21 個項目(如城市:北京、上海、廣州…),點擊任一項目跳轉至第二頁(通用詳情頁)。第二頁有三個按鈕(地圖、相片、筆記),需根據第一頁選擇的項目,導航至對應城市的地圖/相片/筆記頁面。

核心架構:Intent 承載標識符

關鍵在於「第一頁選項 → 唯一標識 → 第二頁接收 → 按鈕點擊時攜帶標識啟動第三頁」。

實作步驟

1. 定義資料模型

public class CityItem {
    public int id;           // 唯一識別碼
    public String name;      // 顯示名稱
    public String mapKey;    // 地圖頁面所需參數
    public String photoKey;  // 相片頁面所需參數
    public String noteKey;   // 筆記頁面所需參數
}

2. GridView 頁面(MainActivity)

gridView.setOnItemClickListener((parent, view, position, id) -> {
    CityItem item = (CityItem) parent.getItemAtPosition(position);
    Intent intent = new Intent(MainActivity.this, DetailActivity.class);
    intent.putExtra("city_id", item.id);
    intent.putExtra("city_name", item.name);
    intent.putExtra("map_key", item.mapKey);
    intent.putExtra("photo_key", item.photoKey);
    intent.putExtra("note_key", item.noteKey);
    startActivity(intent);
});

3. 通用詳情頁(DetailActivity)

public class DetailActivity extends AppCompatActivity {
    private String mMapKey, mPhotoKey, mNoteKey;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);

        // 接收參數
        Intent intent = getIntent();
        mMapKey = intent.getStringExtra("map_key");
        mPhotoKey = intent.getStringExtra("photo_key");
        mNoteKey = intent.getStringExtra("note_key");
        String cityName = intent.getStringExtra("city_name");
        // 更新標題等 UI
        setTitle(cityName);

        // 綁定按鈕點擊
        findViewById(R.id.btn_map).setOnClickListener(v -> navigate(MapActivity.class, mMapKey));
        findViewById(R.id.btn_photo).setOnClickListener(v -> navigate(PhotoActivity.class, mPhotoKey));
        findViewById(R.id.btn_note).setOnClickListener(v -> navigate(NoteActivity.class, mNoteKey));
    }

    private void navigate(Class<?> target, String key) {
        if (key == null) { Toast.makeText(this, "資料未就緒", Toast.LENGTH_SHORT).show(); return; }
        Intent i = new Intent(this, target);
        i.putExtra("key", key);
        startActivity(i);
    }
}

4. 目標頁面(以 MapActivity 為例)

public class MapActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);
        String key = getIntent().getStringExtra("key");
        // 根據 key 載入對應城市地圖...
    }
}

進階優化

  • Parcelable 替代多個 putExtra:讓 CityItem 實作 Parcelable,單次 putExtra("city", item) 傳遞完整物件。
  • ViewModel + LiveData:若採用 MVVM,可在共用 ViewModel 中持有當前選中城市,各 Fragment/Activity 觀察同一資料源。
  • 深層連結:為各城市頁面配置 intent-filter,支援從通知、網頁直接跳轉。

常見錯誤

❌ 在 DetailActivity 重新查詢資料庫導致效能差、邏輯分散。
✅ 由上游直接攜帶所有必要參數,下游純粹負責展示與轉發。
❌ 忘記處理 key 為 null 的防禦性程式碼。
✅ 統一在 navigate() 中判空並提示。

此模式清晰分離「選擇→參數傳遞→二級導航」三層職責,擴充新城市或新功能鍵時,只需補充資料模型與對應 Activity,無需修改核心邏輯。

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