【问题标题】:Kotlin Can't Send Data From Model Class With PutextraKotlin 无法使用 Putextra 从模型类发送数据
【发布时间】:2021-04-03 23:41:17
【问题描述】:

我创建了一个类似下面的结构。当我单击第一个活动中的列表时,我想要第二个活动中有关该项目的信息。但是,我无法使用 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)
    }

CustomersDetails.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
}

}

【问题讨论】:

  • CustomerDetailschosenCustomer 的类型是什么?你为什么在getStringExtra() 的结果上调用toString()?您是否添加了日志记录或使用调试器查看调用 getStringExtra() 时得到的结果?

标签: android listview kotlin android-intent onitemclicklistener


【解决方案1】:

一种选择可能是让您的自定义类实现 Serializable 接口,然后您可以使用 Intent#putExtra() 方法的 putExtra(Serializable..) 变体在 Intent extra 中传递对象实例。

您可以使用 intent.getParcelableExtra(/key/"Name") 提取 Parcelable obj

【讨论】:

  • 我的模型类实现了 parcelable。当我这样做时,意图起作用了。但我无法发送数据
  • 不是getStringExtra,而是getParcelableExtra
  • choosenCustomer= intent.getParcelableExtra("Name").toString() 这是正确的。 在写模型名称?这不起作用
  • 先生,我编辑了我的问题。请查看并回答我
  • choosenCustomer= intent.getParcelableExtra&lt;CustomerModel&gt;("Name").toString()"不起作用,因为您将 CustomerModel 转换为字符串。如果要将 CustomerModel 的实例保存到字段中,请不要使用 .toString(),只需 choosenCustomer= intent.getParcelableExtra&lt;CustomerModel&gt;("Name")
【解决方案2】:

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

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

你应该使用:

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

我认为第一个sn-p的intent值变成了null

【讨论】:

  • 先生,我编辑了我的问题。请查看并回答我
【解决方案3】:

CustomerModel 需要可序列化。

class CustomerModel : Serializable

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

在您编辑问题后编辑:

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

我们为什么要序列化对象?

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

SerializableParcelable 之间的区别

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

【讨论】:

  • 先生,我编辑了我的问题。请查看并回答我
  • @MertKavrayıcı 我可以看到您正在使用Parcelable,请参阅更新答案
猜你喜欢
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多