我正在开发一个应用程序,其中主屏幕完全是根据网络服务器的响应构建的。我们过去常常在回收站视图中显示这些内容,但由于视图非常复杂并且几乎没有任何共同点,因此滚动不顺畅,因为回收行为非常昂贵。
我决定为我必须公开的每种类型的视图创建一个Fragment,并将它们添加到ScrollView内的LinearLayout。结果令人惊讶。没有回收使得滚动非常平滑,方向变化也变得更好,因为片段具有生命周期并且它们的数据可以被序列化。但是,我遇到了一个新问题:
https://code.google.com/p/android/issues/detail?id=69403
根据我对此问题的理解:
Android multiple fragment transaction ordering
为了解决这个问题,我必须包含支持库的来源,除非绝对必要,否则我不会这样做。
有没有人知道如何显示这种动态内容的其他方式?
编辑: 这是我现在的代码:
FragmentTransaction tx = mFragmentManager.beginTransaction();
mContainerList = new ArrayList<>(containers);
if(mFragmentManager.getFragments() != null) {
for (Fragment f : mFragmentManager.getFragments())
if (f != null)
tx.remove(f);
Collections.reverse(mContainerList);
}
for(final InitResult.Container c : mContainerList) {
InitFragment fragment = null;
switch (c.getType()) {
case InitResult.Container.HORIZONTAL_LIST:
if (c.getItems() != null && c.getItems().size() > 0 && c.getItems().get(0).getType().equals(InitResult.Container.BANNER))
fragment = new InitBannerFragment();
else
fragment = new InitHListFragment();
break;
case InitResult.Container.GRID:
fragment = new InitGridFragment();
break;
case InitResult.Container.BANNER:
fragment = new InitBannerFragment();
break;
case InitResult.Container.PROMOTIONAL:
fragment = new InitPromotionalFragment();
break;
case InitResult.Container.PROTEGE:
fragment = new InitProtegeFragment();
break;
case InitResult.Container.PROTEGE_ACTIVE:
fragment = new InitProtegeActiveFragment();
break;
}
if (fragment != null) {
fragment.setInitContainer(c);
tx.add(containerList.getId(), fragment);
}
}
tx.commitAllowingStateLoss();
mFragmentManager.executePendingTransactions();
每当刷新屏幕时,我都会运行此代码。请注意,如果我第一次没有这样做,我需要反转容器列表,以便按所需顺序列出。
我的问题发生在新项目来自服务器时,而不仅仅是包含更新内容的列表。如果这个新项目出现,它将不会按所需顺序放置,它将被放置在列表的末尾。