2014-08-27 76 views
3

我有一个带有SearchFragment和SearchResultFragment的MainActivity。从活动到片段传递复杂对象的列表

当用户按下搜索按钮时,我使用SearchParameters作为参数从SearchFragment执行到MainActivity的回调。

在MainActivity上我比显示一个LoadFragment并加载结果。
当我收到结果时,我想将结果对象列表传递给SearchResultFragment。

这样做的最好方法是什么?

我知道你常做这样的,如果它只是一个结果:

public static SearchResultFragment newInstance(SearchResult result) { 
    SearchResultFragment f = new SearchResultFragment(); 
    Bundle args = new Bundle(); 
    args.putInt("result", result); // Make result parceable 
    f.setArguments(args); 
    return f; 
} 

但我怎么做这与对象的列表?

我能想到的另一个解决方案是在片段的onAttach方法中获取对MainActivity的引用,然后在MainActivity上调用方法getResults()。

什么是最好的方法?

+0

使用相同的回调方法将活动列表发送到片段。 – Luksprog 2014-08-27 12:00:58

+0

您的问题是否已解决或您是否需要进一步的帮助?请不要忘记提供有用的答案,并接受最有帮助的答案。 – 2014-08-29 11:51:21

回答

6

在大多数情况下,您可以避免传递复杂对象,但如果不能,则只需使用getters和setter。尝试是这样的:

public static SearchResultFragment newInstance(SearchResult result) { 
    SearchResultFragment f = new SearchResultFragment(); 
    f.setResult(result);   
    return f; 
} 

尽量避免这种情况,有Bundle传递数据是一个更好的解决方案。尽可能使用Parcelable

4

注意:我的答案假设您试图将数据聚合传递给片段一次。如果您试图定期更新包含新信息(新结果)的现有片段,那么可能最好在Fragment中使用专用方法将结果保存为参数并更新UI。

这两种方法都可以接受,尤其是取决于您希望给予您的搜索结果的范围,但我希望将结果作为“静态”参数传递(意味着不会从Activity动态获取)原因如下:

  • Fragment s的意UI的可重复使用的作品,这意味着Android的框架允许你在另一个Activity相同Fragment整合;在这种情况下,与附加的Activity必须实现给定的获取器相比,集成更容易(更灵活),并且Fragment实际上可以由另一个实体(例如“结果获取器”)构建并附加到Activity而不知道结果(减轻潜在重构)
  • Fragment参数被保留,这意味着相同的Fragment初始化代码(其从参数提取结果)也将处理一个活动重新启动后自动Fragment重新实例(例如屏幕旋转)例如;否则,你会还必须处理保存,结果实体自己

在另一只手的修复,把导致Bundle作为Fragment参数会稍微慢一点,因为接收到新的结果后,您创建一个额外的结构(Bundle)然后你包裹(serialize)和unarcel(反序列化)。在Activity重新启动时它会更快,不过因为在这种情况下您不必打包它(它已经完成)。我只是为了完整起见而提到它,因为除非你的结果非常大(这是一个有效的用例,但也许更适合于分页加载呢?),你不会注意到,反正也不应该在意。

要通过多个结果给Fragment(假设单个结果为int):

final Bundle args = new Bundle(); 
args.putIntArray(SearchResultFragment.ARG_NAME_RESULTS, results); // results being an int[] 
fragment.setArguments(args); 

只需使用Bundle#putIntegerArrayList(String, ArrayList<Integer>)代替如果resultsArrayList<Integer>类型。

相关问题