FragmentStatePagerAdapter.notifyDataSetChanged不刷新页面的解决办法
来源:互联网 发布:淘宝妹子李小芳 编辑:程序博客网 时间:2024/05/24 06:37
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); }
- FragmentStatePagerAdapter.notifyDataSetChanged不刷新页面的解决办法
- FragmentStatePagerAdapter.notifyDataSetChanged不刷新页面的解决办法
- Android FragmentStatePagerAdapter.notifyDataSetChanged()刷新数据的问题
- BaseAdapter调用notifyDataSetChanged不刷新页面
- listview notifydatasetchanged 不刷新的一种解释
- listview notifyDataSetChanged不刷新
- notifyDataSetChanged ListView 不刷新
- FragmentStatePagerAdapter的刷新问题
- IE中页面无法刷新,方法不执行的解决办法
- ListView notifyDataSetChanged()不刷新数据
- 关于 ListView 调用 notifyDataSetChanged 不刷新的问题
- Adapter中notifyDataSetChanged()不刷新GetView的问题
- Adapter.notifyDataSetChanged()数据改变却不刷新的原因
- 已解决:ViewPager的notifyDataSetChanged不刷新问题
- jquery中load()加载页面,刷新之后,加载的页面不显示的解决办法
- Android listView使用Adapter.notifyDataSetChanged()不刷新
- 调用notifyDataSetChanged之后listview不刷新
- listview调用notifyDataSetChanged()后不刷新界面
- 给apk系统签名的方法
- 辛星浅析rails server监听机器外部机器无法访问的问题
- java实现定时任务的三种方法
- 语言的目的
- google-play-services_lib的应用检查是否有google service
- FragmentStatePagerAdapter.notifyDataSetChanged不刷新页面的解决办法
- HttpUtils注释
- Spring注解详解
- 访问内容提供者
- 04(maven+SSH)之maven热部署
- 离职谈话
- Http请求方式和框架
- android 6.0编译
- Android开发UI之全屏沉浸式应用