我有这样的结构:
Activity A有一个ViewPager。ViewPager的页面上有多个Fragment。
Activity A有一个复杂对象列表,我想在这些页面上显示出来。
当用户在ViewPager中点击一个项目时,Activity B必须启动。Activity B还需要具有这个复杂对象的列表。
所以我必须传递这个列表。
A-> Fragment(s)->B
首先我发现不能使用fragment的构造函数来传递数据到它。我必须使用parcelable或serializable。在片段中,我必须再次进行打包或序列化以传递给B。
但是我不想将整个复杂数据列表序列化或打包两次,只为了将其传递给B。
我想避免使用静态字段。
然后我想到了将监听器传递给片段,该监听器侦听项单击,并通知我的Activity A,然后Activity A使用数据启动Activity B。对我而言,这看起来最干净,因为实际上数据属于A,因此A使用数据启动片段,片段返回A,然后A使用数据启动B。我不必随处传递数据(序列化!)。
但是这似乎行不通,因为我如何使用序列化来将侦听器传递给片段?使用片段中的侦听器回到活动有什么问题?
我该如何解决这个问题?
编辑
我在一个关于对话框片段的线程中找到了这个解决方案:Get data back from a fragment dialog - best practices?
我在我的片段中添加了这个,并让我的活动实现特定的接口。这将解决从片段传递数据到B的问题。但我仍然需要将A中的列表传递给片段。可能我需要使用Parcelable...
编辑:我尝试过Parcelable,它可以工作。但是我的列表中的对象之间有很多字段,也有地图等内容。编写Parcelable代码(写/读)非常麻烦。也许我只需要坚持静态数据...
Activity A有一个ViewPager。ViewPager的页面上有多个Fragment。
Activity A有一个复杂对象列表,我想在这些页面上显示出来。
当用户在ViewPager中点击一个项目时,Activity B必须启动。Activity B还需要具有这个复杂对象的列表。
所以我必须传递这个列表。
A-> Fragment(s)->B
首先我发现不能使用fragment的构造函数来传递数据到它。我必须使用parcelable或serializable。在片段中,我必须再次进行打包或序列化以传递给B。
但是我不想将整个复杂数据列表序列化或打包两次,只为了将其传递给B。
我想避免使用静态字段。
然后我想到了将监听器传递给片段,该监听器侦听项单击,并通知我的Activity A,然后Activity A使用数据启动Activity B。对我而言,这看起来最干净,因为实际上数据属于A,因此A使用数据启动片段,片段返回A,然后A使用数据启动B。我不必随处传递数据(序列化!)。
但是这似乎行不通,因为我如何使用序列化来将侦听器传递给片段?使用片段中的侦听器回到活动有什么问题?
我该如何解决这个问题?
编辑
我在一个关于对话框片段的线程中找到了这个解决方案:Get data back from a fragment dialog - best practices?
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnArticleSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
}
}
我在我的片段中添加了这个,并让我的活动实现特定的接口。这将解决从片段传递数据到B的问题。但我仍然需要将A中的列表传递给片段。可能我需要使用Parcelable...
编辑:我尝试过Parcelable,它可以工作。但是我的列表中的对象之间有很多字段,也有地图等内容。编写Parcelable代码(写/读)非常麻烦。也许我只需要坚持静态数据...