在第二个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
相关产品推荐
相关产品推荐

