android - 为什么 `parcelize` 不能在我的自定义回收器适配器类和我的自定义活动类之间传递数据?
问题描述
我正在尝试将自定义类实例从自定义回收器适配器类传递到自定义活动类,parcelize
但并非所有自定义类属性都被正确传递。未传递的实例化类属性是在主自定义类之外定义的另一个自定义类的实例化的属性。当我尝试从第二个自定义类中读取值时,我得到null
这是我的自定义类:
package com.riverstonetech.gositeuk.Model
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
@Parcelize
data class Site(var name: String? = null): Parcelable {
var address: Address = Address("")
var description: String? = null
var locationCoordinate: Coordinate = Coordinate(0.0)
var distance: Int? = null
var price: Double? = null
}
package com.riverstonetech.gositeuk.Model
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
@Parcelize
data class Address(var line1: String? = null): Parcelable {
var line2: String? = null
var line3: String? = null
var line4: String? = null
var postcode: String? = null
var phoneNumber: String? = null
var siteURL: String? = null
}
package com.riverstonetech.gositeuk.Model
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
@Parcelize
data class Coordinate(var Latitude: Double? = null): Parcelable {
var Longitude: Double? = null
}
这是我的自定义回收器适配器类:
package com.riverstonetech.gositeuk
import android.content.Intent
import android.content.res.Resources
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.core.content.ContextCompat.startActivity
import androidx.recyclerview.widget.RecyclerView
import java.text.DecimalFormat
class SiteAdapter(
private val mainActivity: CountiesActivity,
private val siteList: List<Site>) : RecyclerView.Adapter<SiteAdapter.ListItemHolder>() {
inner class ListItemHolder(val view: View):
RecyclerView.ViewHolder(view),
View.OnClickListener {
internal var name = view.findViewById<View>(R.id.textViewSiteName) as TextView
internal var distance = view.findViewById<View>(R.id.textViewSiteDistance) as TextView
internal var price = view.findViewById<View>(R.id.textViewSitePrice) as TextView
init {
view.isClickable = true
view.setOnClickListener(this)
}
override fun onClick(view: View) {
// mainActivity.showDetails(adapterPosition)
val intent = Intent(mainActivity, Details::class.java)
intent.putExtra("SELECTED_SITE", siteList[adapterPosition])
startActivity(mainActivity, intent, null)
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListItemHolder {
val itemView = LayoutInflater.from(parent.context)
.inflate(R.layout.recycler_list_item, parent, false)
return ListItemHolder(itemView)
}
override fun getItemCount(): Int {
if (siteList != null) {
return siteList.size
}
// error
return -1
}
override fun onBindViewHolder(holder: ListItemHolder, position: Int) {
val site = siteList[position]
holder.name.text = site.name
holder.distance.text = site.distance.toString() + holder.view.context.getString(R.string.miles)
val decimalFormatter = DecimalFormat("#,##0")
holder.price.text = holder.view.context.getString(R.string.poundSign) + decimalFormatter.format(site.price).toString()
}
}
这是我的自定义活动类:
package com.riverstonetech.gositeuk
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import kotlinx.android.synthetic.main.activity_details.*
class Details : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_details)
val site = intent.getParcelableExtra<Site>("SELECTED_SITE")
Log.i("Info", "${site.name}")
siteNameTextView.text = site.name
Log.i("line 1", "${site.address.line1}")
}
}
解决方案
将我所有的属性声明移动到我的 3 个自定义类的主要构造函数中。
推荐阅读
- python - 使用 tensorflow 数据集对表格数据进行训练循环
- windows - 如何使用 Azure 中的所需状态配置 (DSC) 进行 Windows VM 的代理设置?
- javascript - 从 JavaScript 数组中使用包含指数和分数的术语的 LaTex 代码有错误的结果
- algorithm - 将网格细分为越来越小的部分的标准算法
- c# - 使用 DBA 添加的表中的新字段更新代码优先模型
- go - BigQuery 更改架构会影响数据吗?
- javascript - 异步函数返回未定义/待处理的承诺,但代码中不允许等待
- c# - ASP.NET Core 5 既不尊重 JsonConverter 也不尊重 TypeConverter
- sql - 如何在数据块中显示与某些字符串匹配的表
- scala - 通过在 Scala 3 中展开类型将案例类转换为另一个案例类