【问题标题】:Duplicate Fragments with RecyclerView appearing in ViewPager after swiping滑动后出现在 ViewPager 中的 RecyclerView 重复片段
【发布时间】:2015-08-22 08:12:27
【问题描述】:

带有 RecyclerView 的片段在 ViewPager 中出现问题。滑动后重新创建片段时,重复的 RecyclerView 会出现重叠。 我正在使用 ViewPager、Fragment、FragmentStatePagerAdapter

图1:第一次有RecyclerView就好了。

图 2:滑动多个片段然后滑动回同一个片段后,重复的片段在滚动时会重叠。

使用 FragmentStatePagerAdapter

class SlidingFragmentPagerAdapter extends FragmentStatePagerAdapter {
        SparseArray<FragmentMain> registeredFragments = new SparseArray<FragmentMain>();
        FragmentManager fm;

        public SlidingFragmentPagerAdapter(FragmentManager fm) {
            super(fm);
            this.fm = fm;
        }

        @Override
        public Fragment getItem(int position) {
            Calendar cal = Calendar.getInstance();
            cal.add(Calendar.DATE, -1 * (FragmentViewPager.MAX_PAGE - position - 1));

            return FragmentMain.newInstance(position + "", cal.getTime());
        }

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

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            FragmentMain fragment = (FragmentMain)  super.instantiateItem(container, position);
            registeredFragments.put(position, fragment);
            return fragment;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            registeredFragments.remove(position);
            super.destroyItem(container, position, object);
        }

        public FragmentMain getRegisteredFragment(int position) {
            return registeredFragments.get(position);
        }
    }

使用 ViewPager

mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
rootView.findViewById(R.id.img_floating_btn2);
mSlidingTabLayout = (SlidingTabLayout) view.findViewById(R.id.sliding_tabs);
mSlidingTabLayout.setDistributeEvenly(true);
adapter = new SlidingFragmentPagerAdapter(getFragmentManager());
mViewPager.setAdapter(adapter);
mViewPager.setCurrentItem(MAX_PAGE);
mSlidingTabLayout.setViewPager(mViewPager);

注意 我尝试使用 mViewPager.setOffscreenPageLimit(adapter.getCount());但是在 ViewPager 中有超过 50 个片段

【问题讨论】:

  • 您是否在碎片离开寻呼机时销毁它们?
  • 我不会破坏它们。
  • 我假设您在片段中使用该 ViewPager,在这种情况下,实例化适配器时使用 getChildFragmentManager() 而不是 getFragmentManager()。
  • 我已经尝试过使用 getChildFragmentManager() 和 getFragmentManager()
  • 你解决了这个问题吗?

标签: android android-viewpager android-recyclerview


【解决方案1】:

我遇到了同样的问题,我有一个 ViewPager,它的 RootFragment 包含其他片段。我将这些片段添加到 RootFragment 中:

getFragmentManager().beginTransaction().add(containerLayout.getId(), ItemFragment.newInstance()).commit();

我通过将其更改为替换而不是添加来修复它。

getFragmentManager().beginTransaction().replace(containerLayout.getId(), ItemFragment.newInstance()).commit();

即使容器是空的,你也必须使用替换而不是添加!

【讨论】:

  • 嗨,这里的 containerLayout 是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 2017-08-12
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多