Как передать список объектов из действия A в действие B в Котлине? - PullRequest
0 голосов
/ 09 октября 2019

У меня есть 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
    }

Но я получаю исключение Null Pointer

Ответы [ 5 ]

3 голосов
/ 09 октября 2019

В build.gradle вашего приложения под областью android добавьте это и синхронизируйте gradle -

androidExtensions {
        experimental = true
    }

Затем сделайте так, чтобы ваш класс объектов обрабатывался следующим образом -

@Parcelize
data class Persona() : Parcelable {

}

Теперь вы можете отправлять иполучить список Parcelable по назначению.

Примечание * - Parcelize - экспериментальная функция.

2 голосов
/ 09 октября 2019

Передача списка данных через интерфейс намерения 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");
        }
    }
}
1 голос
/ 09 октября 2019

Шаг 1. Добавьте это в свое приложение build.gradle внутри области Android.

 androidExtensions {
        experimental = true
    }

Шаг 2: Сделайте класс объекта реализующим Parcelable

@Parcelize
 class Persona():Parcelable {
}

Шаг 3. В упражнении Aотправить данные через намерение:

  val intent = Intent(this, B::class.java)
            intent.putParcelableArrayListExtra("list", personaArrayList)
            startActivity(intent)

Шаг 4: В действии B для получения данных:

 val list = intent.getParcelableArrayListExtra<Persona>("list")
0 голосов
/ 09 октября 2019

В вашем классе 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
0 голосов
/ 09 октября 2019

В своем задании B, чтобы получить список, попробуйте выполнить следующее:

var arr = this.getIntent().getParcelableArrayListExtra<Parcelable>("Personas")

и убедитесь, что ваш Persona равен extend Parcelable, как показано ниже.

...