【问题标题】:How to pass live data with Intent如何使用 Intent 传递实时数据
【发布时间】:2019-09-08 00:00:41
【问题描述】:

如何将 LiveData 与 Intent 传递给另一个 Activity?

我正在尝试将 LiveData 对象传递到一个新的 Activity 中,该 Activity 使用 ViewPager 2 一次显示一个对象。

这是 ViewModel 中的实时数据

private LiveData<List<WrestlersEntity>> mWrestlersList;

public LiveData<List<WrestlersEntity>> getWrestlersList() {
return mWrestlersList;
}

片段传递实时数据。

adapter.setOnItemClickListener(wrestler -> {
    Bundle bundle = new Bundle();
    bundle.putSerializable("Value", (Serializable)mViewModel.getWrestlersList());


Intent addEditIntent = new Intent(getActivity(), AddEditWrestlerActivity.class);
    addEditIntent.putExtras(bundle);
    startActivityForResult(addEditIntent);

寻呼机活动

    Intent intent = this.getIntent();
    Bundle bundle = intent.getExtras();
    List<WrestlersEntity> wrestler (List<WrestlersEntity>)bundle.getSerializable("Value");

我收到以下错误。

java.lang.ClassCastException: androidx.room.RoomTrackingLiveData cannot be cast to java.io.Serializable

如果您不能将实时数据转换为可序列化,我还有哪些其他选项可以将 LiveData> 传递给新活动。

如果你想查看完整的代码,这里是 git 的链接。

https://github.com/Shawn-Nichol/Wrestlers

【问题讨论】:

  • 复制 LiveData 中的内容,将其放入 Bundle 中,然后在 Intent 中传递。
  • @MichaelKrause,你能给我举个例子吗?我以为我已经在我的片段中这样做了。
  • @MichaelKrause 你为什么删除你的答案,我只是在尝试?
  • 您的 getWrestlersList() 返回一个 LiveData,但是您要传递给捆绑包的是 LiveData 内的 List 并且从您到目前为止发布的代码中并不明显如何得到。当我能准确回答您的问题时,我很乐意取消删除。
  • 如果有帮助,我可以包含 GIT

标签: android android-livedata


【解决方案1】:

您的getWrestlersList() 方法返回一个包装您的List&lt;WrestlersEntity&gt; 的LiveData。您要直接传递给您的 Bundle 的是 List&lt;WrestlersEntity&gt;,但包装在 List 的序列化实现中。这就是为什么下面的代码将 LiveData 的值包装在 ArrayList 中的原因。

所以,你可以这样做:

bundle.putSerializable("Value", new ArrayList<>(mViewModel.getWrestlersList().getValue()));

然后从 Bundle 中读取它:

List<WrestlersEntity> wrestlers = (List<WrestlersEntity>)bundle.getSerializable("Value");

【讨论】:

  • 我得到,“第二个参数类型错误”需要:'java.io.Serializable' 我的实时数据应该是可变的吗?
  • 更新了我的答案-您确实需要将列表包装在 ArrayList 中。你能再试一次吗?
  • 当然 - 但看起来你的 WrestlersEntity 类没有实现 Serializable。
  • 你的权利它没有,我以为我应该在片段和活动上实现序列化。我一会儿试试看。
  • 有意义的是,您需要在创建对象的类上实现序列化。感谢您的所有帮助@Michael Krause
猜你喜欢
  • 2019-10-20
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 2011-07-24
  • 2021-07-12
  • 1970-01-01
相关资源
最近更新 更多