2017-09-13 100 views
1

我使用ViewPager並在其中顯示許多不同的Fragments,不僅在內容上,而且它們也使用不同的類。要顯示的清單應動態地改變,即使我設法四處交換項目,並添加新的適配器(並調用notifyDataSetChanged),如果我嘗試改變下一個項目它仍然會滑到它使用mPager.setCurrentItem(mPager.getCurrentItem() + 1);動態更改ViewPager的下一頁

我只是在當前項目和當前下一個項目之間添加一個新的Fragment,它在適配器中正確顯示,但由於下一個已經預加載,因此適配器中的getItem甚至沒有被調用。

是否有另一種方法比notifyDataSetChanged「更強」,告訴我的ViewPager它應該再次獲得下一個項目?


代碼示例:

的添加,讓我FragmentPagerAdapter內項目的方法(只有樣品,而不是實際的代碼)

public void add(@NonNull Integer fragmentIndex) { 
    mFragmentOrder.add(fragmentIndex); 
    notifyDataSetChanged(); 
} 

@Override 
public Fragment getItem(int position) { 
    int selectedFragment = mFragmentOrder(position); 
    Fragment fragment; 

    switch (selectedFragment) { 
     case 1: 
      fragment = new FragmentA(); 
      break; 
     case 2: 
      fragment = new FragmentB(); 
      break; 
     case 3: 
      fragment = new FragmentC(); 
      break; 
     default: 
      fragment = new FragmentD(); 
      break; 
    } 

    return fragment; 
} 

這是用於進入下一個項目的功能(我不允許重擊)

public void goToNext() { 
    mPager.setCurrentItem(mPager.getCurrentItem() + 1); 
} 

EDITS:

編輯1:使用FragmentStatePagerAdapter代替並設置OffscreenPageLimit 0我已經試過了,但都無濟於事。

編輯2:[解決方案]使用FragmentStatePagerAdapter並覆蓋getItemPosition函數返回POSITION_NONE或在適當情況下的索引解決了該問題。由於某些原因,即使在執行此功能的正確版本之後,正常的FragmentPagerAdapter仍然提供錯誤的Fragment

+0

https://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html –

+0

我已經嘗試過使用FragmentStateAdapter,它無法解決問題。正如我所說的,''ViewPager''不是爲新的「下一個」幻燈片重新調整適配器,它只是顯示已經預加載的那個。嘗試設置關閉頁面限制也沒有任何效果。 – Raeglan

回答

1

默認情況下,FragmentPagerAdapter假定其項目的數量和位置保持不變。因此,如果您想介紹動態,則必須通過在繼承的適配器類中實現getItemPosition(Object object)方法來自行提供。一個非常基本的(但效率不高)的實現是這樣的:

@Override 
public int getItemPosition(Object object) { 
    return POSITION_NONE; 
} 

每次父視圖是確定的其子視圖(項目)之一的位置是否已經改變,該代碼會強制片段重新創建。如果你不想在不必要的時候重新玩遊戲,你必須在方法中包含一些邏輯。事情是這樣的:

@Override 
public int getItemPosition (Object object) { 
    if (fragmentOrder.indexOf(object) == -1) { 
     return POSITION_NONE; 
    } else { 
     return index; 
    } 
} 

最後,通過添加onDestroyView方法您的碎片和抵消你正在使用的意見要注意可能的內存泄漏。

Here與這兩個PagerAdapter是一個很好的討論這些問題。

+0

將你的解決方案與「FragmentStateAdapter」結合起來就可以了。謝謝,你鏈接的文章也很有用。 – Raeglan