在使用ViewPager+FragmentPagerAdapter時候,更新Fragment裏數據是不起做用,FragmentPagerAdapter添加或減小Fragment時,前面的Fragment內容更新不起做用等等問題,有的作法是暴力刪除fragment列表,如java
List<Fragment> fragments = getSupportFragmentManager().getFragments(); for (int i = fragments.size() - 1; i >= 0; i--) { getSupportFragmentManager().beginTransaction().remove(fragments.get(0)); }
也有作法是重寫FragmentPagerAdapter的instantiateItem(ViewGroup container, int position)方法等等,有效雖有效,但比較粗爆。ide
FragmentPagerAdapter.getItem(int position)在更新時候不必定會被調用,因此Fragment更新是無效,來看看FragmentPagerAdapter的父類PagerAdapter中的代碼instantiateItemspa
FragmentPagerAdapter裏在根據getItemId(int position)來判斷當前position裏Fragment是否存在,若是存在,則不會建立亦不會更新,那麼要讓FragmentPagerAdapter的更新生效,那在getItemId(int)里根據數據返回一個惟一的數據ID,當FragmentPagerAdapter更新時,數據ID改變了,那麼Fragment就會調用getItem(int)去獲取新Fragment,達到更新效果code
@Override public long getItemId(int position) { // 獲取當前數據的hashCode int hashCode = mData.get(position).hashCode(); return hashCode; }