滑动后出现在 ViewPager 中的带有 RecyclerView 的重复片段
Duplicate Fragments with RecyclerView appearing in ViewPager after swiping
带有 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 和一个包含其他片段的 RootFragment。我将这些片段添加到 RootFragment 中:
getFragmentManager().beginTransaction().add(containerLayout.getId(), ItemFragment.newInstance()).commit();
我通过将其更改为替换而不是添加来修复它。
getFragmentManager().beginTransaction().replace(containerLayout.getId(), ItemFragment.newInstance()).commit();
即使容器是空的,您也必须使用替换而不是添加!
带有 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 和一个包含其他片段的 RootFragment。我将这些片段添加到 RootFragment 中:
getFragmentManager().beginTransaction().add(containerLayout.getId(), ItemFragment.newInstance()).commit();
我通过将其更改为替换而不是添加来修复它。
getFragmentManager().beginTransaction().replace(containerLayout.getId(), ItemFragment.newInstance()).commit();
即使容器是空的,您也必须使用替换而不是添加!