2015-08-22 87 views
6

使用RecyclerView的碎片在ViewPager中出現問題。刷新後重新創建碎片時,重複RecyclerView會出現重疊。 我正在使用ViewPager,Fragment,FragmentStatePagerAdapter使用ViewPager後出現的RecyclerView重複碎片

圖1:第一次有RecyclerView是好的。

圖2:在滑動多個片段然後滑回同一片段之後,在滾動時重複的片段會重疊。

Pic 1 Pic 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()); buti在ViewPager中有超過50個片段

+0

當你離開尋呼機時,你是在摧毀碎片嗎? –

+0

我並沒有摧毀它們。 – touchchandra

+0

我假設你在一個片段中使用ViewPager,在這種情況下,當你實例化適配器時,使用getChildFragmentManager()而不是getFragmentManager()。 – Luksprog

回答

2

我有同樣的問題,我有一個ViewPager與RootFragment包含其他片段。我將這些片段添加到RootFragment:

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

我通過更改它來替換而不是添加來修復它。

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

即使當容器是空的,你必須使用替換而不是添加!