碎片在被破坏/无效后继续被恢复

时间:2017-01-24 15:29:06

标签: android android-fragments

我使用自定义FragmentAdapter将片段保存到List

我想要的过程:

1)用户单击列表项并在参数中创建一个新的Activity,然后使用TagsPageAdapter.addPage(fragment)创建片段;

2)这个创建的片段在他的参数

中有一个“id”int

3)当我点击addPage时,它会验证List中的所有片段以检查是否有任何片段具有id,如果是,则恢复它,如果没有,则创建new并添加到列表中

这三个步骤是完全正常的,问题是当我尝试删除一个时(下面的适配器代码后出错)

适配器:

private class TabsPagerAdapter extends FragmentPagerAdapter {

        private Bundle bundle;
        private String titulo;


        private TabsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public LeiAberta getItem(int position) {
            current = fragments.get(position);
            return current;
        }

        private void addPage(LeiAberta page) {
            boolean found = false;
            for (int i = 0; i < fragments.size(); i++) {
                leiAberta = fragments.get(i);
                if (leiAberta != null) {
                    if (leiAberta.getArguments() != null) {
                        if (leiAberta.getArguments().getInt("id") == page.getArguments().getInt("id")) {
                            viewPager.setCurrentItem(i);
                            found = true;
                        }
                    }
                }
            }
            if (!found) {
                fragments.add(page);
                notifyDataSetChanged();
                viewPager.setCurrentItem(fragments.size() - 1);
            }
        }

        @Override
        public int getCount() {
            return fragments.size();
        }

        @Override
        public CharSequence getPageTitle(int position) {
            this.bundle = fragments.get(position).getArguments();
            if (this.bundle != null) {
                this.titulo = bundle.getString("titulo");
            }
            return titulo;
        }
    }

我用什么来删除列表中的片段:

     int current_position = viewPager.getCurrentItem();
        if(current_position == 0) {
     viewPager.setCurrentItem(current_position +1);
        } else {
    viewPager.setCurrentItem(current_position -1);
        }
fragments.remove(current_position);
        adapter.notifyDataSetChanged();

如果我删除当前标签/片段,然后在列表中打开另一个项目,将添加另一个标签,无论哪个项目,它只是将旧片段恢复到相同位置,由于某种原因,删除的位置列表中的片段保持填充阴影,奇怪的是:当我删除时list.size();减少,为什么?从哪里恢复这个旧片段?我怎么能真正摧毁它,所以addPage并没有在“阴影”中找到它

1 个答案:

答案 0 :(得分:0)

我试过了:

  1. Update ViewPager dynamically?
  2. Removing fragments from FragmentStatePagerAdapter
  3. Remove Fragment Page from ViewPager in Android
  4. How to remove pages in Android ViewPager?
  5. 和其他许多人

    显然唯一的解决方案就是这个框架:

    https://github.com/inloop/UpdatableFragmentStatePagerAdapter?utm_source=android-arsenal.com&utm_medium=referral&utm_campaign=4851

    使用此覆盖

    @Override
    public int getItemPosition(Object object) {
        if (fragments.contains(object)) return fragments.indexOf(object);
        else return POSITION_NONE;
    }