reorder pages in FragmentStatePagerAdapter using getItemPosition(Object object)
Looking at the source of FragmentStatePagerAdapter, I figured out exactly what is going wrong. The FragmentStatePagerAdapter caches the fragments and saved states in ArrayLists: mFragments
and mSavedState
. But when the fragments are reordered, there's no mechanism for reordering the elements of mFragments
and mSavedState
. Therefore, the adapter will provide the wrong fragments to the pager.
I've filed an issue for this, and attached a fixed implementation (NewFragmentStatePagerAdapter.java) to the issue. In the fix, I've added a getItemId()
function to FragmentStatePagerAdapter. (This mirrors the reordering implementation in FragmentPagerAdapter.) An array of the itemIds by adapter position is stored at all times. Then, in notifyDataSetChanged()
, the adapter checks if the itemIds array has changed. If it has, then mFragments
and mSavedState
are reordered accordingly. Further modifications can be found in destroyItem()
, saveState()
and restoreState()
.
To use this class, getItemPosition()
and getItemId()
must be implemented consistently with getItem()
.