在 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 即可自动为您生成 writeToParcel
和 createFromParcel
方法!
@Parcelize
data class Herbal(...) : Parcelable
将此添加到您的 build.gradle 文件中:
androidExtensions {
features = ["parcelize"]
}
我想传递选中项目的一些信息,以便在新的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 即可自动为您生成 writeToParcel
和 createFromParcel
方法!
@Parcelize
data class Herbal(...) : Parcelable
将此添加到您的 build.gradle 文件中:
androidExtensions {
features = ["parcelize"]
}