如何在 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")

并确保您的Personaextend 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()

在Android中将一个对象从一个活动传递到另一个活动

如何通过 kotlin 中的意图传递对象的 MutableList

将一个 mutableList 从活动 A 传递到 Kotlin 中的活动 B。