FragmentStatePagerAdapter.notifyDataSetChanged不刷新页面的解决办法

 FragmentStatePagerAdapter.notifyDataSetChanged  不刷新 里面的 Fragment信息,找了半天,最后通过查询其源码解决了该问题:

先进入源码中的notifyDataSetChanged

技术分享

发现这句,mObservable,看名字,观察者,应该就是用来实时监测viewPager绑定数据源的变化的,再进入notifychanged方法

技术分享

发现一个遍历,这个遍历会去调用mObservers中的每一个元素的变化,我们再进入onChanged,

技术分享

到了,这里,发现onChanged只是一个抽象类中的方法,,既然会调用,肯定会被重写咯,找了一圈,在viewPager中的内部内继承了,

技术分享

躲的还是蛮深的,不过这还没有找到我们需要关注的地方,那就继续找,dataSetChanged

void dataSetChanged() {
        // This method only gets called if our observer is attached, so mAdapter is non-null.

        final int adapterCount = mAdapter.getCount();
        mExpectedAdapterCount = adapterCount;
        boolean needPopulate = mItems.size() < mOffscreenPageLimit * 2 + 1 &&
                mItems.size() < adapterCount;
        int newCurrItem = mCurItem;

        boolean isUpdating = false;
        for (int i = 0; i < mItems.size(); i++) {
            final ItemInfo ii = mItems.get(i);
            final int newPos = mAdapter.getItemPosition(ii.object);

            if (newPos == PagerAdapter.POSITION_UNCHANGED) {
                continue;
            }

            if (newPos == PagerAdapter.POSITION_NONE) {
                mItems.remove(i);
                i--;

                if (!isUpdating) {
                    mAdapter.startUpdate(this);
                    isUpdating = true;
                }

                mAdapter.destroyItem(this, ii.position, ii.object);
                needPopulate = true;

                if (mCurItem == ii.position) {
                    // Keep the current item in the valid range
                    newCurrItem = Math.max(0, Math.min(mCurItem, adapterCount - 1));
                    needPopulate = true;
                }
                continue;
            }

            if (ii.position != newPos) {
                if (ii.position == mCurItem) {
                    // Our current item changed position. Follow it.
                    newCurrItem = newPos;
                }

                ii.position = newPos;
                needPopulate = true;
            }
        }

        if (isUpdating) {
            mAdapter.finishUpdate(this);
        }

        Collections.sort(mItems, COMPARATOR);

        if (needPopulate) {
            // Reset our known page widths; populate will recompute them.
            final int childCount = getChildCount();
            for (int i = 0; i < childCount; i++) {
                final View child = getChildAt(i);
                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
                if (!lp.isDecor) {
                    lp.widthFactor = 0.f;
                }
            }

            setCurrentItemInternal(newCurrItem, false, true);
            requestLayout();
        }
    }
这里就是我们需要关注的地方了,一看这么多,确实有点头疼,不过,我们只关注重点,看第13行,有句
final int newPos = mAdapter.getItemPosition(ii.object);

这里就调用的了我们的adapter中的getItemPosition,我们再看看getItemPosition会返回什么,会接收什么,复写fragmentStatePagerAdapter中的getItemPosition方法,发现只会返回父类中的方法

技术分享

接着看父类中的方法

技术分享

再看看POSITION_UNCHANGED是干嘛用的,

技术分享

妈蛋,这下总算是明白了,这里一直return POSITION_UNCHANGED;

return一个“未改变”的标志给dataSetChanged()中,它当然打死都不更新咯,请看dataSetChanged()中的第15-17行

技术分享

竟然知道原因了,那就好做了,直接将要刷新的页面 return POSITION_NONE


FragmentStatePagerAdapter中继承

@Override
    public int getItemPosition(Object object) {
        if (object.getClass().getName().equals(ProjectFragment.class.getName())
                || object.getClass().getName().equals(ProjectFragment2.class.getName())) {
            return POSITION_NONE;
        }
        return super.getItemPosition(object);
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值