将 ArrayList 的子级发送到 Android Activity
Posted
技术标签:
【中文标题】将 ArrayList 的子级发送到 Android Activity【英文标题】:Send child of ArrayList to an Android Activity 【发布时间】:2015-05-10 01:09:38 【问题描述】:我想发送一个类的对象 - 的子对象
ArrayList<ArrayList<Double>>
到一个 android 活动。这是我的课:
package cz.honza.backpropagation.network.trainingset;
import java.io.Serializable;
import java.util.ArrayList;
import cz.honza.backpropagation.network.parser.Csv;
public class TrainingLineBase extends ArrayList<ArrayList<Double>> implements TrainingLine, Serializable
private static final long serialVersionUID = -2777317734401540881L;
@Override
public String getEditorType()
return Csv.SIMPLE;
它实现了可序列化,所以我可以简单地使用
public Intent putExtra (String name, Serializable value)
用于启动该 Activity 的 Android Intent 方法。然后我尝试在 Activity 的 onCreate 方法中读回它
getIntent().getSerializableExtra(INTENT_EXTRA_DATA);
看似简单,但行不通。我没有得到我的 TrainingLineBase 类的对象,我得到了
ArrayList<ArrayList<Double>>
它是继承树中的父级。它保存与原始 TrainingLineBase 相同的数据。所以看起来序列化并不能很好地工作。传输了真实数据,但没有传输类类型。
这是 Android 中的错误还是我做错了什么?
更新:有一种非常简单的方法可以获得有效的解决方案。我可以将继承更改为所有权。 neww 类很好地序列化/反序列化:
public class TrainingLineBase implements TrainingLine, Serializable
public ArrayList<ArrayList<Double>> mData;
// ....
【问题讨论】:
您是否尝试将其转换为 TrainingLineBase,或检查getIntent().getSerializableExtra(INTENT_EXTRA_DATA) instanceof TrainingLineBase
的结果?
你如何放置数据?
转换到 TrainingLineBase 会导致 ClassCastException,因为您不能将父级转换为子级。
放数据: Intent i = new Intent(getContext(), TrainingLineBaseActivity.class); i.putExtra(TrainingLineBaseActivity.INTENT_EXTRA_DATA, (Serializable)getItem(position)); // 在调试器中检查它确实是 TrainingLineBase 的实例 ((Activity)getContext()).startActivityForResult(i, position);
【参考方案1】:
我没有直接回答你的问题,但我可以建议一个替代方案。
正如 Android 文档底部的 Serializable 接口 http://developer.android.com/reference/java/io/Serializable.html 所建议的那样,将类的状态编码为 JSON 可能比普通的 Java 序列化更可取。
如果您想采用这种方式,您可以使用 GSON 或类似的 JSON 库将您的对象“序列化”为字符串,并将结果放入 Intent 上的 StringExtra。然后,为了反序列化,从 Intent 中获取 StringExtra,使用 GSON 反序列化 JSON 字符串。使用 GSON 时,您指定要尝试反序列化的对象的类。
【讨论】:
以上是关于将 ArrayList 的子级发送到 Android Activity的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Flutter 中动态附加到 Column 小部件的子级
当 UITableViewController 是 UITabBarController 的子级时,滚动不起作用