将 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 的子级时,滚动不起作用

来自自定义 LinearLayout 的子级不显示波纹效果

将 XElement 的子级转换为字符串 [重复]

React useContext 不会将值传递给深层嵌套的子级

添加的 View 将 RecyclerView 作为父级,但视图不是真正的子级