【问题标题】:Exception: "Cannot Be cast to java.util.ArrayList" when storing ArrayList from intent例外:从意图存储 ArrayList 时“无法转换为 java.util.ArrayList”
【发布时间】:2018-02-28 22:19:23
【问题描述】:

当我尝试存储从 Fragment 类中的意图检索的 ArrayList 时,出现异常 cannot be cast to java.util.ArrayList

现在我正在使用适配器的意图将 ArrayList 传递给我的片段类。我的片段类将使用 Parcelable 检索数据并将其存储到一个对象中,以便我可以将数据用于我的片段类。但问题是一旦它检索到数据,它就会引发异常。是不是因为我使用了错误的对象来存储我的数据?

MainAdapter 类:

final Intent intent = new Intent(view.getContext(), DetailActivityFragment.class);
intent.putExtra("baking_app", mbakingAppsDataModels.get(position));
Log.d("onClick mBDM size: ", mbakingAppsDataModels.get(position)+"");
//intent.putExtras(args);
view.getContext().startActivity(intent);

片段类:

Bundle args = getIntent().getExtras();
ArrayList<BakingAppsDataModel> bakingAppsDataModels = args.getParcelable("baking_app");

例外:

FATAL EXCEPTION: main
                                                                             Process: com.example.kavin.bakingapp, PID: 22716
                                                                             java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.kavin.bakingapp/com.example.kavin.bakingapp.ui.DetailActivityFragment}: java.lang.ClassCastException: com.example.kavin.bakingapp.Data.BakingAppsDataModel cannot be cast to java.util.ArrayList
                                                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
                                                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
                                                                                 at android.app.ActivityThread.-wrap11(Unknown Source:0)
                                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
                                                                                 at android.os.Handler.dispatchMessage(Handler.java:105)
                                                                                 at android.os.Looper.loop(Looper.java:164)
                                                                                 at android.app.ActivityThread.main(ActivityThread.java:6541)
                                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                                 at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
                                                                              Caused by: java.lang.ClassCastException: com.example.kavin.bakingapp.Data.BakingAppsDataModel cannot be cast to java.util.ArrayList
                                                                                 at com.example.kavin.bakingapp.ui.DetailActivityFragment.onCreate(DetailActivityFragment.java:30)

【问题讨论】:

  • 这是一个列表吗?? mbakingAppsDataModels.
  • 您可以将代码缩进 4 个空格来正确格式化,而不是使用反引号。
  • @SantanuSur 它是一个 ArrayList
  • @csmckelvey 会不会,我会记住的

标签: android android-fragments android-intent android-recyclerview


【解决方案1】:

可能你在 Intent 中传递了一个 BakingAppsDataModel 类型的对象,因为方法 bakeAppsDataModels.get(position) 返回一个对象。

尝试替换这个:

ArrayList<BakingAppsDataModel> bakingAppsDataModels = args.getParcelable("baking_app");

用这个:

BakingAppsDataModel bakingAppsDataModels = args.getParcelable("baking_app");

【讨论】:

  • 所以我的目标是当用户点击主菜单上的特定食物时,它将使用意图并启动有关该特定食物的所有信息的新屏幕。使用 get(position) 是否是一种确保其根据用户选择的食物传递正确数据库的好方法?
  • 是的,这是一个很好的方法,但显然您需要断言没有访问错误的索引。另一种方法是在模型中使用标识符,这些标识符映射到列表中的视图。但是,我会使用您的方法,因为它不那么复杂且更有效。
【解决方案2】:

这是因为您放入捆绑包的不是列表,而是列表中的项目:

final Intent intent = new Intent(view.getContext(), DetailActivityFragment.class);

// You are adding the item here instead of the List
intent.putExtra("baking_app", mbakingAppsDataModels.get(position));

应该是:

final Intent intent = new Intent(view.getContext(), DetailActivityFragment.class);

intent.putExtra("baking_app", mbakingAppsDataModels);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-29
    • 2014-03-16
    • 2023-04-07
    • 2015-07-16
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多