zoukankan      html  css  js  c++  java
  • Android FragmentPagerAdapter数据刷新notifyDataSetChanged没效果研究

          android3.0之后提出fragment概念正逐渐取代tabhost的地位,support-v4包也提供了很好使用的viewpager类。不多说。了解过fragment之后你会发现比tabhost好用许多,并且viewpager也支持fragment的嵌入,这使得项目的模块化耦合度大大降低,项目中使用ViewPager+Fragment实现tab分页+子tab页内容滑动效果

    效果图如下:

    点击个个tab1更换pageadapter的值实现数据的更新。通过继承fragmentpageadpater你会发现使用起来很方便。具体fragmentpageradapter怎么用?网上很多看客可以去搜一下。
    下面我就要说到本文的核心当你更新里fragment List集合后调用fragmentpageadpater的notifyDataSetChanged方法时发现数据根本就没有刷新。网络上会提到pageadapter的刷新方案如下代码:
      复写pageradapter的getItemPosition方法设置tag为POSITION_NONE意思是没有找到child要求重新加载。
    @Override  
    public int getItemPosition(Object object) {  
       return POSITION_NONE;  
    }  
     
    结果你发现是刷新了一下但内容还是原始的数据。通过对fragmentpageadapter的源码查看你会在instantiateItem方法里面发现这一段
      
    // Do we already have this fragment?
            String name = makeFragmentName(container.getId(), position);
            Fragment fragment = mFragmentManager.findFragmentByTag(name);
            if (fragment != null) {
                if (DEBUG) Log.v(TAG, "Attaching item #" + position + ": f=" + fragment);
                mCurTransaction.attach(fragment);
            } else {
                fragment = getItem(position);
                if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment);
                mCurTransaction.add(container.getId(), fragment,
                        makeFragmentName(container.getId(), position));
            }
    原来他会先去FragmentManager里面去查找有没有相关的fragment如果有就直接使用如果没有才会触发fragmentpageadapter的getItem方法获取一个fragment。所以你更新的fragmentList集合是没有作用的,还要清除FragmentManager里面缓存的fragment。解决办法:在继承的fragmentpageadapter类里面添加这么一个方法
     
    public void setFragments(ArrayList fragments) {
       if(this.fragments != null){
          FragmentTransaction ft = fm.beginTransaction();
          for(Fragment f:this.fragments){
            ft.remove(f);
          }
          ft.commit();
          ft=null;
          fm.executePendingTransactions();
       }
      this.fragments = fragments;
      notifyDataSetChanged();
    }
    就能完美的解决fragmentpageadapter数据刷新。
  • 相关阅读:
    运维常用python库&模块
    find&正则表达式
    博客园背景粒子连线代码
    xshell几款绝佳配色方案
    解决ssh连接超时(ssh timeout)的方法
    Java-计划存储
    @Repository、@Service、@Controller 和 @Component
    帮助对@Repository注解的理解
    Struts 2学习笔记——拦截器相关
    JAVA UUID 生成
  • 原文地址:https://www.cnblogs.com/guoxiaoyue/p/3296666.html
Copyright © 2011-2022 走看看