遇到在viewpager 動態(tài)初始化fragment的問題苍凛,內(nèi)存中第一次加載了三個fragment奈惑,后來有添加了一些萤悴,結(jié)果會發(fā)現(xiàn)原來的position的位置上的fragment是之前的出現(xiàn)錯位的問題丢早。
比如 之前的viewpager中包含
熱門璧疗,活動坯辩,探索。而修改之后為熱門崩侠,生活漆魔,活動,探索却音,這樣生活的tab其實就會出現(xiàn)問題改抡,會被初始化為活動。
這個問題
通過將FragmentPagerAdapter改為FragmentStatePagerAdapter并修改
@Override
public int getItemPosition(@NonNull Object object) {
return PagerAdapter.POSITION_NONE;
}
解決了此問題系瓢,
這個方法的默認(rèn)實現(xiàn)是
return PagerAdapter.POSITION_UNCHANGED
因為阿纤,F(xiàn)ragmentPagerAdapter 中處理緩存Fragment是將其加入FragmentManager中,
ArrayList<Op> mOps = new ArrayList<>();
這個數(shù)組在存儲fragment夷陋,add方法不是在中間添加數(shù)據(jù)欠拾,所以會導(dǎo)致順序問題胰锌。
而FragmentStatePagerAdapter存儲的fragment方法是不一樣的,沒有通過fragment管理藐窄,而是自己另外寫了List保存狀態(tài)等信息资昧。
另外需要注意的是,F(xiàn)ragmentPagerAdapter
的instantiateItem方法
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
final long itemId = getItemId(position);
// Do we already have this fragment?
String name = makeFragmentName(container.getId(), itemId);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
mCurTransaction.attach(fragment);
} else {
fragment = getItem(position);
if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
mCurTransaction.add(container.getId(), fragment,
makeFragmentName(container.getId(), itemId));
}
if (fragment != mCurrentPrimaryItem) {
fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
}
return fragment;
它會通過findFragmentByTag優(yōu)先從已有fragment中找荆忍,所以涉及到fragment和外層交互的地方格带,不能簡單粗暴的new一個fragment,因為它adapter中的fragment 可能和我們想象的不是同一個刹枉,
private static String makeFragmentName(int viewId, long id) {
return "android:switcher:" + viewId + ":" + id;
}
是通過 viewpager的id 和 position 拼接成tag叽唱。
不過如果不遇到需要動態(tài)添加fragment的場景,應(yīng)該不會出什么問題嘶卧。