如何在 Kotlin 中将对象列表从活动 A 传递到活动 B?
Posted
技术标签:
【中文标题】如何在 Kotlin 中将对象列表从活动 A 传递到活动 B?【英文标题】:How to Pass a List of Objects from activity A to activity B in Kotlin? 【发布时间】:2020-02-06 09:15:10 【问题描述】:我有 2 个活动,我想传递一个对象的数组列表并在 ListView 上显示它
活动 A:
btnGuardar.setOnClickListener
if(edtNombre.text.toString().equals("") ||
edtApellido.text.toString().equals("") ||
edtFecha.text.toString().equals(""))
Toast.makeText(this@Main2Activity, "Debes llenar todos los campos!", Toast.LENGTH_SHORT).show()
else
var estadoSel : String
estadoSel = estado.onItemSelectedListener.toString()
var per = Persona(edtNombre.text.toString(),edtApellido.text.toString(),estadoSel,edtFecha.text.toString())
personas.add(per)
val intent = Intent(this@Main2Activity,Main3Activity::class.java)
//intent.putExtra("Personas", personas as Serializable)
intent.putParcelableArrayListExtra("Personas", ArrayList(personas))
edtFecha.text = null
edtApellido.text = null
edtNombre.text = null
estado.setSelection(0)
Toast.makeText(this@Main2Activity, "Registro Guardado", Toast.LENGTH_SHORT).show()
活动 B:
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main3)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
//val intent = Intent()
val bundle = getIntent().extras
var arr = bundle?.getParcelableArrayList<Persona>("Personas")!!
//var arr : ArrayList<Persona> = (ArrayList<Persona>())intent.getSerializableExtra("Personas")
//intent.getSerializableExtra("Personas")
//arr = intent.extras!!.get("Personas")
val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, arr)
listaPersonas.adapter = adapter
但是我得到一个空指针异常
【问题讨论】:
请发布您的logcat
。
startActivity 调用在哪里?
哪一行你得到空指针异常?你在Persona
上实现了Parcelable
接口吗?
【参考方案1】:
在你应用的 android 范围下的 build.gradle 中添加这个并同步 gradle -
androidExtensions
experimental = true
然后让你的对象类parceble如下 -
@Parcelize
data class Persona() : Parcelable
现在您可以按意图发送和接收 Parcelable 列表。
注意* - Parcelize 是实验性功能。
【讨论】:
【参考方案2】:通过 Intent 传递数据列表在 Model 类上实现 Parcelable
接口。
人物模型类:
import android.os.Parcel
import android.os.Parcelable
data class Person(val name: String?, val age: Int) : Parcelable
constructor(source: Parcel) : this(
source.readString(),
source.readInt()
)
override fun describeContents() = 0
override fun writeToParcel(dest: Parcel, flags: Int) = with(dest)
writeString(name)
writeInt(age)
companion object
@JvmField
val CREATOR: Parcelable.Creator<Person> = object : Parcelable.Creator<Person>
override fun createFromParcel(source: Parcel): Person = Person(source)
override fun newArray(size: Int): Array<Person?> = arrayOfNulls(size)
MainActivity:
class MainActivity : AppCompatActivity()
var personList = arrayListOf<Person>()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
personList.add(Person("Person1", 31))
personList.add(Person("Person2", 32))
personList.add(Person("Person3", 33))
var intent = Intent(this, BActivity::class.java)
intent.putParcelableArrayListExtra("personList", personList)
Handler().postDelayed( startActivity(intent), 2000)
BActivity:
class BActivity : AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_b)
val extras = intent.extras
val personList = extras?.getParcelableArrayList<Person>("personList")
if (personList != null)
personList.forEach Log.i("BActivity", "Name: $it.name Age: $it.age" )
else
Log.i("BActivity", "PersonList in null");
【讨论】:
【参考方案3】:在您的活动 B 中获取您的列表尝试如下
var arr = this.getIntent().getParcelableArrayListExtra<Parcelable>("Personas")
并确保您的Persona
是extend Parcelable
,如下所示。
class Persona() : Parcelable
// ....
@Override
public void writeToParcel(Parcel dest, int flags)
//....
private void readFromParcel(Parcel in)
//....
override fun describeContents(): Int
return 0
companion object CREATOR : Creator<Persona>
override fun createFromParcel(parcel: Parcel): Persona
return Persona(parcel)
override fun newArray(size: Int): Array<Persona?>
return arrayOfNulls(size)
【讨论】:
【参考方案4】:在您的 Activity A 发送数组列表中
intent.putParcelableArrayListExtra("Personas", personas)
在您的 Activity B 中获取数组列表
intent.getParcelableArrayListExtra("Personas")
在你应用的 build.gradle 里面的 android 标签中添加这个并与 gradle 同步 -
androidExtensions
experimental = true
数据类
@Parcelize data class Persona(
val name: String,
) : Parcelable
【讨论】:
像魅力一样工作,而且它不再是实验性的;)【参考方案5】:第 1 步。将此添加到您的应用程序 build.gradle 内的 android 范围内。
androidExtensions
experimental = true
第二步:让对象类实现 Parcelable
@Parcelize
class Persona():Parcelable
第 3 步。在 Activity A 中通过 Intent 发送数据:
val intent = Intent(this, B::class.java)
intent.putParcelableArrayListExtra("list", personaArrayList)
startActivity(intent)
第 4 步:在活动 B 中接收数据:
val list = intent.getParcelableArrayListExtra<Persona>("list")
【讨论】:
以上是关于如何在 Kotlin 中将对象列表从活动 A 传递到活动 B?的主要内容,如果未能解决你的问题,请参考以下文章
在 android studio kotlin 中将数据从活动传递到片段(不重复,这些方法不起作用)
在 Kotlin 中将值从 Activity 传递到 Fragment
如何在 Kotlin 中将 ArrayList 转换为 JSONArray()