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

Android Activity 間傳遞 ArrayList 完整實戰(Intent + Parcelable)

     編輯:程式設計綜合問答

錯誤現場

// 發送端
ArrayList<String> players = new ArrayList<>();
players.add(text);
Intent intent = new Intent(this, Igra.class);
intent.putStringArrayListExtra("players", players);
startActivity(intent);

// 接收端
ArrayList<String> players = data.getStringArrayListExtra("players"); // data 未定義 → 編譯錯誤

核心問題

  1. 每次點擊重新 new Intent,導致 putExtra 的數據丟失(示例中 createNewTextView 創建新 Intent 又未用於啟動)。
  2. 接收端用錯變量名:data 未聲明,應用 getIntent()。

標準修正代碼

// 1. 成員變量持有數據源
private ArrayList<String> players = new ArrayList<>();

private TextView createNewTextView(String text) {
    TextView tv = new TextView(this);
    tv.setText(text);
    players.add(text); // 累加到成員列表
    return tv;
}

public void zacniIgro(View v) {
    // 2. 同一 Intent 實例攜帶數據並啟動
    Intent intent = new Intent(this, Igra.class);
    intent.putStringArrayListExtra("players", players);
    startActivity(intent);
}
// Igra.java 接收端
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_igra);

    // 3. 直接從啟動 Intent 獲取
    ArrayList<String> players = getIntent().getStringArrayListExtra("players");
    if (players != null) {
        // 更新 UI、RecyclerView 等
    }
}

進階:自定義對象列表傳遞

String 列表直接支持;自定義類需實現 Parcelable(推薦)或 Serializable:

@Parcelize // Kotlin 一鍵生成
data class Player(var name: String, var age: Int) : Parcelable

// Java 手寫 Parcelable 或用插件生成
intent.putParcelableArrayListExtra("players", playerList);
// 接收
ArrayList<Player> list = getIntent().getParcelableArrayListExtra("players");

大數據量替代方案

方案適用閾值優點缺點
Intent Extra< 100KB / 幾百條簡單、進程間自動序列化Binder 緩衝區限制 (~1MB),超限崩潰
SharedPreferences / DataStore持久化配置跨進程可讀、應用重啟保留主線程 IO、不適合高頻大數據
Application 類單例 / 靜態緩存進程內共享零序列化、極快進程被殺數據丟失、內存洩漏風險
Room / SQLite / FileProvider大數據/結構化/跨應用查詢靈活、持久可靠代碼量大、需異步

總結

Activity 傳列表:**成員變量累加數據 → 同一 Intent putExtra → startActivity → getIntent() 取出**。超大數據改用本地持久化或單例緩存。

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