Kotlin 无法使用 putextra 从模型类发送数据



我创建了一个类似下面的结构。当我在第一个活动中单击列表时,我希望在第二个活动中获得有关该项目的信息。但是,我无法使用putextra发送数据。如果你感兴趣,我将非常高兴。我对这个题目不完全了解。因此,如果有人感兴趣,我会分配必要的代码。

客户.kt

val listView=findViewById<ListView>(R.id.listView)
val list=ArrayList<CustomerModel>()
listView.setOnItemClickListener { adapterView, view, i, l ->
val intent=Intent(applicationContext,CustomersDetails::class.java)
//I think that's not true   intent.putExtra("Name",list[i])
startActivity(intent)
}

客户详细信息.kt

val intent=intent
choosenCustomer= intent.getStringExtra("Name").toString()

CustomerModel.kt

class CustomerModel(val title:String, val description:String,val img:Int): Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString()!!,
parcel.readString()!!,
parcel.readInt()
) {
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(title)
parcel.writeString(description)
parcel.writeInt(img)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<CustomerModel> {
override fun createFromParcel(parcel: Parcel): CustomerModel {
return CustomerModel(parcel)
}
override fun newArray(size: Int): Array<CustomerModel?> {
return arrayOfNulls(size)
}
}

}

CustomerAdapter.kt

class CustomerAdapter(var mCtx:Context,val resources: Int,var items:List<CustomerModel>):
ArrayAdapter<CustomerModel>(mCtx,resources,items) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val layoutInflater: LayoutInflater= LayoutInflater.from(mCtx)
val view:View=layoutInflater.inflate(resources,null)
val imageView: ImageView=view.findViewById(R.id.image)
val titleTextView: TextView=view.findViewById(R.id.cuText)
val descriptionTextView:TextView=view.findViewById(R.id.ofText)
var mItem:CustomerModel=items[position]
imageView.setImageDrawable(mCtx.resources.getDrawable(mItem.img))
titleTextView.text=mItem.title
descriptionTextView.text=mItem.description
return view
}

}

一个选项可以让您的自定义类实现Serializable接口,然后您可以使用intent#putExtra((方法的putExtra变量(Serializable..(在intent extra中传递对象实例。

您可以使用intent.getParcelableExtra(/key/"名称"(提取Parcelable对象

你不应该像以前那样重新定义意图,而不是

val intent=intent
choosenCustomer= intent.getStringExtra("Name").toString()

您应该使用:

choosenCustomer= intent.getStringExtra("Name").toString()

第一个片段的intent值变为null我认为

CustomerModel需要是可序列化的。

class CustomerModel : Serializable

查看更多信息:https://spin.atomicobject.com/2016/11/28/sending-data-actions-android/

编辑问题后编辑:

  • 如果使用Serializable,则只使用putExtragetSerializableExtra
  • 如果您使用Parcelable,那么您将只使用putExtragetParcelableExtra

为什么要序列化对象

当您通过网络发送对象或将其存储在文件中时,通常需要对对象进行序列化,因为用于存储的网络基础结构和硬件组件了解位和字节,而不了解对象。在Android中,当你想将对象从任何活动发送到另一个活动时,你不能像在基元类型中那样发送它。

SerializableParcelable之间的差异

  • 可串行化接口非常容易实现。它是一个标记接口,通过实现它,您的POJO类能够被序列化和反序列化;而Parcelable不是一个标记接口,因此当您在类中实现它时,它有一些方法必须重写
  • 可序列化接口不是Android SDK的一部分,它使用反射来封送操作并创建大量临时对象。在Parcelable中,您可以选择要序列化的字段
  • 由于临时对象的创建和垃圾收集,Serialization比Parcelable慢

最新更新