带有FragmentStatePagerAdapter的ViewPager不断重新创建已删除的片段

时间:2018-08-04 00:39:38

标签: android android-viewpager


需要带有EditText的动态ViewPager的帮助(需要做多个选项卡式编辑器)。
这是我遇到的问题:

    e.e。 G。我创建了3页并放了一些文字,所以我有
    第0页-“ a”
    第1页-“ b”
    第2页-“ c”
    在此处添加工作正常,删除第0 页不是导致“ a”“ c”,而是导致“ a”“ b” 向左,删除第0 < / strong>也会导致“ a”“ b” 而不是“ b”“ c”,也可以删除page2。因此,似乎传呼机会记住已删除页面 n 的文本并将其移至页面 n + 1 ,将文本从页面 n + 1 移至 n + 2 等等
  • 具有相同文本的相同页面,但是现在我删除了page1和page2(顺序无关紧要),所以文本“ a”左了。添加两个新页面将重新创建“ b”和“ c”,下一页将保持空白。
    如果仅删除page1并添加新页面,则会出现文本“ c”。

我去过hereherehere,没有帮助。 试图跟随getItem(int position)调用
还搜索了ViewPager和FragmentStatePagerAdapter源,看起来它与InstantiateItem和/或destroyItem有关,但我不知道到底是什么。


这是我的代码:

Adapter

public class PagerAdapter extends FragmentStatePagerAdapter {
        private ArrayList<Fragment> fragmentsList = new ArrayList<>();
        private ArrayList<String> titlesList = new ArrayList<>();
        private TabLayout layout;
        public PagerAdapter(FragmentManager manager, Context context, ViewPager pager, TabLayout layout) {
            super(manager);
            this.layout = layout;
        }
        @Override
        public Fragment getItem(int position) {
            return fragmentsList.get(position);
        }
        @Override
        public int getItemPosition(@NonNull Object object) {
            return POSITION_NONE;
        }    
        @Override
        public int getCount() {
            return fragmentsList.size();
            }
        @Override
        public CharSequence getPageTitle(int position) {
            return titlesList.get(position);
        }

        public void addFrag(Fragment f, String s) {
            fragmentsList.add(f);
            titlesList.add(s);
        }

        public void removeFragment(int position) {
            if (layout.getChildCount() > 0) 
                layout.removeTabAt(position);
            Fragment fragment = fragmentsList.get(position);
            fragmentsList.remove(fragment);
            titlesList.remove(position);
            FragmentManager manager = fragment.getFragmentManager();
            FragmentTransaction trans = manager.beginTransaction();
            trans.remove(fragment);
            trans.commit();
            notifyDataSetChanged();
        }
    }

RootFragment

 public class RootFragment extends Fragment {
        private TabLayout layout;
        private ViewPager pager;
        private PagerAdapter adapter;
        private int currentTab;
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

            View view = inflater.inflate(R.layout.root_fragment, container, false);

            pager = view.findViewById(R.id.viewpager);
            layout = view.findViewById(R.id.sliding_tabs);
            adapter = new PagerAdapter(getFragmentManager(), getActivity(), pager, layout);
            pager.setAdapter(adapter);
            layout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
                    currentTab = tab.getPosition();
                    pager.setCurrentItem(currentTab);
                }
                @Override
                public void onTabUnselected(TabLayout.Tab tab) {
                }
                @Override
                public void onTabReselected(TabLayout.Tab tab) {
                }
            });

            return view;
        }

        public void addTab(String title) {
            Bundle bundle = new Bundle();
            bundle.putString("data", title);
            LeafFragment leafFragment = new LeafFragment();
            leafFragment.setArguments(bundle);
            adapter.addFrag(leafFragment, title);
            adapter.notifyDataSetChanged();
            layout.setupWithViewPager(pager);
            currentTab = adapter.getCount() - 1;
            pager.setCurrentItem(currentTab);
        }

        public void deleteTab(int position) {
            adapter.removeFragment(position);
        }
    }

非常抱歉,我的英语水平。

1 个答案:

答案 0 :(得分:1)

FragmentStatePagerAdapter已经存储了一个Fragments列表,您在使用它时不需要(也可能不需要)实现自己的列表。简单地:

public class MyAdapter extends FragmentStatePagerAdapter {
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return 3;
    }

    @Override
    public Fragment getItem(int position) {
       //Simply create a fragment based on position here
    }
}

第二,不幸的事实是,在FragmentStatePagerAdapter中删除/重新排序片段似乎仍然存在如下的错误:

https://issuetracker.google.com/issues/36956111

我的建议是,如果您需要从适配器中删除片段,则只需重新创建适配器即可。