我有以下数据类:
data class LegendWrapper(
val data: List<PlayerPerformance>? = emptyList()
)
data class PlayerPerformance(val name: String, val value: Int, val key: String)
data class TestList(val name: String, val data: LegendWrapper)
然后我完成了三月的清单
for((key, value ) in data.legends.all){
recList.add(TestList(key, value))
}
然后,当单击 RecyclerView 中的名称时,我想在另一个活动中获取数据。我尝试按照下面的示例执行此操作,但结果我以字符串的形式获取数据,使用它根本无法正常工作,我尝试通过putParcelableArrayListExtra
我偶然发现类型不匹配异常,如何正确传输 ArrayList到另一个活动?
heroesAdapt = HeroesRecyclerAdapter(this, recList){
testList -> val heroesStatsActivity = Intent(this,HeroesStatsActivity::class.java)
heroesStatsActivity.putExtra("nicknameHeroes", testList.name)
heroesStatsActivity.putExtra("data", testList.data.toString())
startActivity(heroesStatsActivity)
}
我用谷歌搜索了一下,找到了这样一个选项,但它也不起作用,heroesStatsActivity.putExtra("data", testList)
所以我把它传递了。并得到它这样val test = intent.extras?.getSerializable("data") as TestList
尽管数据类本身继承自Serializable data class TestList(val name: String, val data: LegendWrapper) : Serializable
从列表中选择名称时,这是错误
2021-08-22 17:33:12.426 4950-4950/com.example.studyactivitylifecyl E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.studyactivitylifecyl, PID: 4950 java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.example.studyactivitylifecyl.Model.TestList) at android.os.Parcel.writeSerializable(Parcel.java:2113) at android.os.Parcel.writeValue(Parcel.java:1883) at android.os.Parcel.writeArrayMapInternal(Parcel.java:975) at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1620) at android.os.Bundle.writeToParcel(Bundle.java:1303) at android.os.Parcel.writeBundle(Parcel.java:1044) at android.content.Intent.writeToParcel(Intent.java:10855) at android.app.IActivityTaskManager$Stub$Proxy.startActivity(IActivityTaskManager.java:3668) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1723) at android.app.Activity.startActivityForResult(Activity.java:5314) at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:597) at android.app.Activity.startActivityForResult(Activity.java:5272) at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:583) at android.app.Activity.startActivity(Activity.java:5658) at android.app.Activity.startActivity(Activity.java:5611) at com.example.studyactivitylifecyl.HeroesActivity$onCreate$1.invoke(HeroesActivity.kt:45) at com.example.studyactivitylifecyl.HeroesActivity$onCreate$1.invoke(HeroesActivity.kt:40) at com.example.studyactivitylifecyl.Adapters.HeroesRecyclerAdapter$Holder.bindHeroes$lambda-0(HeroesRecyclerAdapter.kt:25) at com.example.studyactivitylifecyl.Adapters.HeroesRecyclerAdapter$Holder.lambda$m9Ppe9nWqwgcbjiXqOm_6-7XHbo(Unknown Source:0) at com.example.studyactivitylifecyl.Adapters.-$$Lambda$HeroesRecyclerAdapter$Holder$m9Ppe9nWqwgcbjiXqOm_6-7XHbo.onClick(Unknown Source:4) at android.view.View.performClick(View.java:7448) at android.view.View.performClickInternal(View.java:7425) at android.view.View.access$3600(View.java:810) at android.view.View$PerformClick.run(View.java:28305) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) Caused by: java.io.NotSerializableException: com.example.studyactivitylifecyl.Model.LegendWrapper at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1240) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1604) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1565) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1488) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:354) at android.os.Parcel.writeSerializable(Parcel.java:2108) at android.os.Parcel.writeValue(Parcel.java:1883) at android.os.Parcel.writeArrayMapInternal(Parcel.java:975) at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1620) at android.os.Bundle.writeToParcel(Bundle.java:1303) at android.os.Parcel.writeBundle(Parcel.java:1044) at android.content.Intent.writeToParcel(Intent.java:10855) at android.app.IActivityTaskManager$Stub$Proxy.startActivity(IActivityTaskManager.java:3668) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1723) at android.app.Activity.startActivityForResult(Activity.java:5314) at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:597) at android.app.Activity.startActivityForResult(Activity.java:5272) at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:583) at android.app.Activity.startActivity(Activity.java:5658) at android.app.Activity.startActivity(Activity.java:5611) at com.example.studyactivitylifecyl.HeroesActivity$onCreate$1.invoke(HeroesActivity.kt:45) at com.example.studyactivitylifecyl.HeroesActivity$onCreate$1.invoke(HeroesActivity.kt:40) at com.example.studyactivitylifecyl.Adapters.HeroesRecyclerAdapter$Holder.bindHeroes$lambda-0(HeroesRecyclerAdapter.kt:25) at com.example.studyactivitylifecyl.Adapters.HeroesRecyclerAdapter$Holder.lambda$m9Ppe9nWqwgcbjiXqOm_6-7XHbo(Unknown Source:0) at com.example.studyactivitylifecyl.Adapters.-$$Lambda$HeroesRecyclerAdapter$Holder$m9Ppe9nWqwgcbjiXqOm_6-7XHbo.onClick(Unknown Source:4) at android.view.View.performClick(View.java:7448) at android.view.View.performClickInternal(View.java:7425) at android.view.View.access$3600(View.java:810) at android.view.View$PerformClick.run(View.java:28305) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
稍微改了一下代码。
@Parcelize
data class LegendWrapper(
val data: List<PlayerPerformance>? = emptyList()
): Parcelable
@Parcelize
data class PlayerPerformance(val name: String, val value: Int, val key: String): Parcelable
@Parcelize
data class TestList(val name: String, val data: LegendWrapper) : Parcelable
接下来,我尝试发送
heroesStatsActivity.putParcelableArrayListExtra("data", testList)
但我得到一个错误
类型不匹配。必需:ArrayList<out Parcelable!>? 找到:测试列表
如果你只写 putExtra
heroesStatsActivity.putExtra("data", testList)
然后第二个活动出错了
val test = intent?.extras?.getParcelable("data")
没有足够的信息来推断类型变量 T
在 Android 中,不同活动之间的所有数据都在一个特殊的Parcel容器中传输。此容器中只能存储某些类型的数据。其中一种类型是
Parcelable
.你在使用
putParcelableArrayListExtra
,没错,它只需要实现ParcelableTestList
接口。为了不手动编写 Parcelable 的实现,可以使用kotlin-parcelize 插件。我将举例说明如何使用 kotlin-parcelize 执行此操作:
我们用注解标记
@Parcelize
所有将被传输并实现接口的类Parcelable
:在活动“A”中,我们将对象
myExtra
放入意图中并启动活动“B”:在活动“B”中,我们从意图中拉出这个对象: