You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在第二个Activity中通过Intent与Parcelable获取ArrayList元素

解决第二个Activity通过Intent+Parcelable获取ArrayList元素的问题

嘿,我来帮你搞定这个问题!要实现这个需求其实很清晰,分三个核心步骤就能搞定,我给你一步步拆解:

1. 让你的数据类实现Parcelable接口

首先,你用来存词汇卡片的实体类(比如叫VocabCard)必须实现Parcelable接口,这样它才能被Intent跨组件传递。

如果你用Java:

import android.os.Parcel;
import android.os.Parcelable;

public class VocabCard implements Parcelable {
    private String word;
    private String definition;

    // 普通构造函数
    public VocabCard(String word, String definition) {
        this.word = word;
        this.definition = definition;
    }

    // Parcel构造函数,用来从Parcel中读取数据
    protected VocabCard(Parcel in) {
        word = in.readString();
        definition = in.readString();
    }

    // 必须实现的CREATOR,用来创建类实例
    public static final Creator<VocabCard> CREATOR = new Creator<VocabCard>() {
        @Override
        public VocabCard createFromParcel(Parcel in) {
            return new VocabCard(in);
        }

        @Override
        public VocabCard[] newArray(int size) {
            return new VocabCard[size];
        }
    };

    @Override
    public int describeContents() {
        return 0; // 几乎所有场景都返回0,除非涉及文件描述符
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        // 把字段写入Parcel,顺序要和读取时完全一致!
        dest.writeString(word);
        dest.writeString(definition);
    }

    // 别忘了添加getter方法方便后续获取数据
    public String getWord() { return word; }
    public String getDefinition() { return definition; }
}

如果你用Kotlin(更省心):

用@Parcelize注解可以自动生成Parcelable的实现代码,省掉一堆模板工作,不过要先确保你的gradle里启用了kotlin-parcelize插件:

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class VocabCard(val word: String, val definition: String) : Parcelable

2. 在MainActivity中传递ArrayList

接下来,在MainActivity里把你的ArrayList<VocabCard>放到Intent中,然后启动第二个Activity:

Java代码:

// 先创建你的词汇卡片列表
ArrayList<VocabCard> vocabList = new ArrayList<>();
vocabList.add(new VocabCard("Android", "基于Linux的开源移动操作系统"));
vocabList.add(new VocabCard("Parcelable", "Android中用于跨组件传递数据的接口"));

// 创建Intent并传递数据
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putParcelableArrayListExtra("VOCAB_LIST", vocabList);
startActivity(intent);

Kotlin代码:

// 创建词汇卡片列表
val vocabList = arrayListOf(
    VocabCard("Android", "基于Linux的开源移动操作系统"),
    VocabCard("Parcelable", "Android中用于跨组件传递数据的接口")
)

// 传递数据并启动目标Activity
val intent = Intent(this, SecondActivity::class.java)
intent.putParcelableArrayListExtra("VOCAB_LIST", vocabList)
startActivity(intent)

3. 在第二个Activity中获取ArrayList

最后一步,在SecondActivity的onCreate方法里,从Intent中取出这个列表:

Java代码:

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

    // 获取Intent中的数据
    ArrayList<VocabCard> receivedList = getIntent().getParcelableArrayListExtra("VOCAB_LIST");
    
    // 现在你就可以遍历列表使用元素啦
    if (receivedList != null) {
        for (VocabCard card : receivedList) {
            Log.d("SecondActivity", "单词:" + card.getWord() + ",释义:" + card.getDefinition());
        }
    }
}

Kotlin代码:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_second)

    // 获取传递过来的列表数据
    val receivedList = intent.getParcelableArrayListExtra<VocabCard>("VOCAB_LIST")
    
    // 遍历使用数据
    receivedList?.forEach { card ->
        Log.d("SecondActivity", "单词:${card.word},释义:${card.definition}")
    }
}

几个要注意的小细节

  • 传递数据时的key(比如上面的"VOCAB_LIST")要前后完全一致,别写错字母或者大小写!
  • 如果你的数据类包含嵌套对象,那嵌套的对象也必须实现Parcelable接口
  • 针对API 33+的Android版本,推荐用getParcelableArrayListExtra(key, VocabCard::class.java)来避免类型转换警告

内容的提问来源于stack exchange,提问作者Schelmuffsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:22:47