455_ViewPager的notify方法





ViewPager的notify方法


Viewpager调用notifyDataSetChanged()是无效的
为什么?????????????????????????
这个问题真的特别蛋疼


PagerAdapter adapter = new PagerAdapter(){...};
viewPager.setAdapter(adapter);
adapter.notifyDataSetChanged();


罪恶源头就是这个PagerAdapter
看看源码把








    /**
     * This method should be called by the application if the data backing this adapter has changed
     * and associated views should update.
     */
    public void notifyDataSetChanged() {
        synchronized (this) {
            if (mViewPagerObserver != null) {
                mViewPagerObserver.onChanged();
            }
        }
        mObservable.notifyChanged();
    }


注释:
如果adapter关联的data变了,调用这个方法,那么关联的view就更新了
bullshit!!!
根本没有更新.


里面是一个同步,然后mObservable.notifyChanged()
看看这个notifyChanged()








    /**
     * Invokes {@link DataSetObserver#onChanged} on each observer.
     * Called when the contents of the data set have changed.  The recipient
     * will obtain the new contents the next time it queries the data set.
     */
    public void notifyChanged() {
        synchronized(mObservers) {
            // since onChanged() is implemented by the app, it could do anything, including
            // removing itself from {@link mObservers} - and that could cause problems if
            // an iterator is used on the ArrayList {@link mObservers}.
            // to avoid such problems, just march thru the list in the reverse order.
            for (int i = mObservers.size() - 1; i >= 0; i--) {
                mObservers.get(i).onChanged();
            }
        }
    }








解决方案:


        ViewPager vp_content = (ViewPager) findViewById(R.id.vp_content);
        adapter = new FragmentStatePagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int position) {
                return list.get(position);
            }


            @Override
            public int getCount() {
                return list.size();
            }


            @Override
            public int getItemPosition(Object object) {
                return POSITION_NONE;
            }
        };
        vp_content.setAdapter(adapter);












试试看
来两个button


    public void remove(View view) {
        list.remove(0);
    }


    public void update(View view) {
        adapter.notifyDataSetChanged();
    }




试验成功.

















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值