显示无法在Android上回收的动态内容

时间:2015-12-09 20:10:45

标签: android android-fragments

我正在开发一个应用程序,其中主屏幕完全是根据网络服务器的响应构建的。我们过去常常在回收站视图中显示这些内容,但由于视图非常复杂并且几乎没有任何共同点,因此滚动不顺畅,因为回收行为非常昂贵。

我决定为我必须公开的每种类型的视图创建一个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();

每当刷新屏幕时,我都会运行此代码。请注意,如果我第一次没有这样做,我需要反转容器列表,以便按所需顺序列出。

我的问题发生在新项目来自服务器时,而不仅仅是包含更新内容的列表。如果这个新项目出现,它将不会按所需顺序放置,它将被放置在列表的末尾。

0 个答案:

没有答案