Search code examples
androidkotlinarraylistparcelable

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


I wanna pass some of informations of the selected item to be viewed in new activity AboutApp.kt, but here I test by one info only (name). I do not have any trouble with RecyclerView, it works. I've seen many ways to do parcelable ArrayList object but feeling confuse where activity to be implemented, so it's getting error in MainActivity and AboutApp (destination intent).

A piece code MainActivity.kt getting error in showSelectedHerbal, when I use 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)
    }

    .......
}

A piece code from AboutApp.kt that getting error in herbalName(). I know that I haven't implemented the parcelable so it's wrong

        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

I'm so sorry, I attach you some of activities that I confuse may be one of them is the right place to be implement parcelable. Here is my data class Herbal.kt

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

A piece code of the object 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
        }
}

Help me please where activity to be write the parcelable ArrayList and how to fix it. Thanks in advance for any help.


Solution

  • First of all the error in your AboutApp.kt is because you have herbalName private in your HerbalData object. Remove the private modifier to access it there.

    Just add @Parcelize annotation over your data class to automatically generate writeToParcel and createFromParcel methods for you!

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

    Add this in your build.gradle file:

    androidExtensions {
        features = ["parcelize"]
    }
    

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