Viewpager 動態(tài)改變數(shù)據(jù) FragmentPagerAdapter與FragmentStatePagerAdapter.

遇到在viewpager 動態(tài)初始化fragment的問題,內存中第一次加載了三個fragment,后來有添加了一些,結果會發(fā)現(xiàn)原來的position的位置上的fragment是之前的出現(xiàn)錯位的問題。

比如 之前的viewpager中包含
熱門,活動,探索。而修改之后為熱門,生活,活動,探索,這樣生活的tab其實就會出現(xiàn)問題,會被初始化為活動。
這個問題

通過將FragmentPagerAdapter改為FragmentStatePagerAdapter并修改

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

解決了此問題,
這個方法的默認實現(xiàn)是

return PagerAdapter.POSITION_UNCHANGED

因為,F(xiàn)ragmentPagerAdapter 中處理緩存Fragment是將其加入FragmentManager中,

ArrayList<Op> mOps = new ArrayList<>();

這個數(shù)組在存儲fragment,add方法不是在中間添加數(shù)據(jù),所以會導致順序問題。
而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的場景,應該不會出什么問題。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容