在 RecyclerView 中单击项目后,不确定在哪里实现可打包的 ArrayList

Not sure where to implements parcelable ArrayList after click item in RecyclerView

我想传递选中项目的一些信息,以便在新的activity AboutApp.kt中查看,但这里我只通过一个信息(名称)进行测试。我对 RecyclerView 没有任何问题,它可以工作。我见过很多方法来处理可打包的 ArrayList 对象,但感觉混淆了 activity 的实现位置,因此在 MainActivity 和 AboutApp(目标意图)中出现错误。

一段代码 MainActivity.kt 在 showSelectedHerbal 中出现错误,当我使用 position to putExtra

class MainActivity : AppCompatActivity() {
    private lateinit var rvHerbal: RecyclerView
    private var list: ArrayList<Herbal> = arrayListOf()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        rvHerbal = findViewById(R.id.rv_herbal)
        rvHerbal.setHasFixedSize(true)

        list.addAll(HerbalData.listData)
        showRecyclerList()
    }

    private fun showRecyclerList() {
        rvHerbal.layoutManager = LinearLayoutManager(this)
        val listHerbalAdapter = ListHerbalAdapter(list)
        rvHerbal.adapter = listHerbalAdapter

        listHerbalAdapter.setOnItemClickCallback(object : ListHerbalAdapter.OnItemClickCallback {
            override fun onItemClicked(data: Herbal) {
                showSelectedHerbal(data)
            }
        })
    }

    ........

    private fun showSelectedHerbal(data: Herbal) {
        val moveIntent = Intent(this, AboutApp::class.java)
        moveIntent.putExtra("Example_Item", list!![position])
        this.startActivity(moveIntent)
    }

    .......
}

来自 AboutApp.kt 的一段代码,在 herbalName() 中出现错误。我知道我没有实现 parcelable 所以这是错误的

        val intent = intent
        val herbalData: HerbalData = intent.getParcelableExtra("Example_Item")

        val title: String = herbalData.herbalName()

        val itemName = findViewById<TextView>(R.id.item_name)
        itemName.text = title

很抱歉,我附上了一些我混淆的活动,其中之一可能是实施 parcelable 的正确位置。这是我的数据 class Herbal.kt

data class Herbal(
    var name: String = "",
    var detail: String = "",
    var photo: Int = 0
)

对象的一段代码HerbalData.kt

object HerbalData {
    private val herbalName = arrayOf("Cengkeh",
        "Ginseng",
        "Jahe")

    ..........

    val listData: ArrayList<Herbal>
        get() {
            val list = arrayListOf<Herbal>()
            for (position in herbalName.indices) {
                val herbal = Herbal()
                herbal.name = herbalName[position]
                herbal.detail = herbalDetail[position]
                herbal.photo = herbalImage[position]
                list.add(herbal)
            }
            return list
        }
}

请帮助我 activity 编写可打包的 ArrayList 以及如何修复它。在此先感谢您的帮助。

我建议你阅读 this

你只需要把 Herbal class Parcelable.

data class Herbal(
    var name: String = "",
    var detail: String = "",
    var photo: Int = 0
) : Parcelable {

    companion object {
        @JvmField
        val CREATOR = object : Parcelable.Creator<Herbal> {
            override fun createFromParcel(parcel: Parcel) = Herbal(parcel)
            override fun newArray(size: Int) = arrayOfNulls<Herbal>(size)
        }
    }

    private constructor(parcel: Parcel) : this(
        name = parcel.readString(),
        detail = parcel.readString(),
        photo = parcel.readInt(),
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(name)
        parcel.writeString(detail)
        parcel.writeInt(photo)
    }

    override fun describeContents() = 0
}

首先,您 AboutApp.kt 中的所有错误是因为您的 HerbalData 对象中有 herbalName private。删除 private 修饰符以在那里访问它。

只需在您的数据上添加 @Parcelize 注释 class 即可自动为您生成 writeToParcelcreateFromParcel 方法!

@Parcelize
data class Herbal(...) : Parcelable

将此添加到您的 build.gradle 文件中:

androidExtensions {
    features = ["parcelize"]
}

PS:参考:https://medium.com/@BladeCoder/a-study-of-the-parcelize-feature-from-kotlin-android-extensions-59a5adcd5909