Не уверен, где реализовать реализуемый ArrayList после щелчка по элементу в RecyclerView - PullRequest
1 голос
/ 25 апреля 2020

Я хочу передать некоторую информацию о выбранном элементе для просмотра в новом действии AboutApp.kt, но здесь я проверяю только одну информацию (имя). У меня нет проблем с RecyclerView, он работает. Я видел много способов сделать объект ArrayList, который можно разложить на части, но чувствовал путаницу в том, где должна быть реализована активность, поэтому он получает ошибку в MainActivity и AboutApp (намерение назначения).

Код изделия MainActivity.kt Получение ошибки в showSelectedHerbal, когда я использую position для установкиExtra

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 , Вот мой класс данных 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
        }
}

Помогите мне, пожалуйста где активность должна быть написана: пакет ArrayList и как это исправить. Заранее благодарю за любую помощь.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Прежде всего ошибка в вашем AboutApp.kt заключается в том, что у вас есть herbalName private в вашем объекте HerbalData. Удалите приватный модификатор, чтобы получить к нему доступ.

Просто добавьте аннотацию @Parcelize к вашему классу данных, чтобы автоматически генерировать для вас методы writeToParcel и createFromParcel!

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

Добавьте это в Ваш файл build.gradle:

androidExtensions {
    features = ["parcelize"]
}

PS: Ссылка: https://medium.com/@BladeCoder / a-study-of-the-parcelize-feature-from- kotlin - android -расширений-59a5adcd5909

0 голосов
/ 25 апреля 2020

Я рекомендую вам прочитать это .

Вам просто нужно сделать Herbal класс 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...