【问题标题】:Passing custom List of data using Bundle使用 Bundle 传递自定义数据列表
【发布时间】:2014-06-19 21:57:13
【问题描述】:

我正在开发一个简单的应用程序,其中包含带有片段的 tabview。我被困在了必须将数据传递给 tabselect 上新创建的片段的地方。

我有一个我的自定义类对象列表:

List<List<NewsObjectClass>> myList;

这是我卡住的地方:

public static class PlaceholderFragment extends ListFragment{

    private static final String ARG_SECTION_NUMBER = "section_number";


    public PlaceholderFragment(){       

    }


    public static PlaceholderFragment newInstance(int sectionNumber, List<List<NewsObjectsClass>> data)  {

        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);

        // Here i want to pass my List<List<NewsObjectClass>> to the bundle

        fragment.setArguments(args);
        return fragment;
    }
...

所以特别是我需要一种方法如何将 myCustomObjects 的 lsits 列表传递给片段,这样我就可以将它用于 lsitview 适配器。

任何关于如何传递此类数据的建议都会很棒。 谢谢。

【问题讨论】:

    标签: android list android-fragments bundle custom-object


    【解决方案1】:

    创建您的NewObjectClassParcelableSerializable,然后有效地创建一个新类,其中包含您的列表,还包括ParcelableSerializable。然后使用Bundle.putSerializable(或putParcelable

    或者,更简单,制作 NewObjectClass Parcelable 然后使用 putParcelableArrayList 如果可以使用 ArrayList 而不是通用 List

    或者,最简单的,使NewObjectClass可序列化并使用putSerializable传递ArrayList&lt;NewObjectClass&gt;,因为ArrayListSerializable

    在最后一种情况下,您可能只需要向您的班级添加 implements Serializable

    或者,如果您的数据看起来很大,请考虑将它们保存在自定义的 Application 派生对象中。您扩展 Application 然后这样的对象将一直存在您的应用程序存在。不要忘记在清单中注册它。

    class MyApplication extends Application {
       public static Object myData;
    }
    

    或者您可以使用共享首选项

    PreferenceManager.getDefaultSharedPreferences().edit().putInt("a", 1).commit();
    PreferenceManager.getDefaultSharedPreferences().getInt("a");
    

    【讨论】:

    • 有没有办法在没有序列化的情况下进行这种数据传递?这是唯一的方法吗?
    • 如果你的类足够简单,你可能只需要添加实现 Serializable 然后将 ArrayList 传递给 Bundle。 Jsva 负责序列化
    • @xenuit 使用 Parcelable 而不是 Serializable,更多信息参见this
    • 好吧,我的类只包含 String 和 Bitmap 对象。还有一件事——这不是使用 List> 的问题吗?
    • 您的数据似乎很大。考虑将它们保存在自定义的应用程序派生对象中。您扩展 Application 然后这样的对象将一直存在您的应用程序存在。不要忘记在清单中注册它。
    【解决方案2】:
    args.putParcelableArrayList(DATA_KEY, new ArrayList<>(data));
    

    【讨论】:

      【解决方案3】:

      使用putSerializable 方法传递您的自定义列表。

      args.putSerializable(KEY, ArrayList<Type>);
      

      并使用getSerializable获取它

      ArrayList<Type> list = (ArrayList<Type>) getArguments().getSerializable(KEY);
      

      【讨论】:

        【解决方案4】:

        或者,最简单的,使 NewObjectClass 可序列化并使用 putSerializable 传递 ArrayList,因为 ArrayList 是可序列化的

        不幸的是,这在我的情况下不起作用。我最终将我的数组列表转换为字符串(或 JSON 字符串)并通过

        发送
        bundle.putString()
        

        然后,在片段中,将字符串解析回数组列表。

        【讨论】:

          猜你喜欢
          • 2016-12-03
          • 2021-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多