首页 > 解决方案 > 为什么 `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}")


    }
}

标签: androidkotlinparcelable

解决方案


将我所有的属性声明移动到我的 3 个自定义类的主要构造函数中。


推荐阅读