有关FragmentPagerAdapter适配器中的fragment数据刷新问题

有很多时候会需要用到选项卡式的布局,如果没有特殊情况一般不需要在viewpager所在activity中更改数据。但是如果需要更改刷新数据如何处理?比如我加个筛选项就需要实时的刷新fragment中的数据。

当数据发生改变调用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。
所以如果不是viewpager中的元素个数增加或者减少调用notifyDataSetChanged方法是不好使的。就不会执行适配器中的getItem方法。那正确的方法就是把缓存的fragment给移除,重新设置fragment。

以下是我代码的事例:

初始化适配器并设置

CivilizationFragment21 civilizationFragment21 = CivilizationFragment21.newInstance(userType, weekId);
 CivilizationFragment22 civilizationFragment22 = CivilizationFragment22.newInstance(userType, weekId);
CivilizationFragment23 civilizationFragment23 = CivilizationFragment23.newInstance(userType, weekId);
       fragments.add(civilizationFragment21);
       fragments.add(civilizationFragment22);
        fragments.add(civilizationFragment23);
         adapter = new CivilizationViewPagerAdapter(getSupportFragmentManager(), titles, fragments);
         mViewPager.setAdapter(adapter);

当有数据发生变化时调用:

 fragment21 = CivilizationFragment21.newInstance(userType, weeks.get(newPosition).getWeek());
                fragment22 = CivilizationFragment22.newInstance(userType, weeks.get(newPosition).getWeek());
                fragment23 = CivilizationFragment23.newInstance(userType, weeks.get(newPosition).getWeek());
                List<Fragment> list = new ArrayList<Fragment>();
                list.add(fragment21);
                list.add(fragment22);
                list.add(fragment23);
                adapter.setFragments(list);
                adapter.notifyDataSetChanged();

适配器:

public class CivilizationViewPagerAdapter extends FragmentPagerAdapter {

    private static final java.lang.String TAG = "校园文明";
    private String titles[];
    private int userType;
    private String weekNow;
    private OnReloadListener mListener;
    private List<Fragment> fgs = null;
    FragmentManager fm;


    public CivilizationViewPagerAdapter(FragmentManager supportFragmentManager, String[] titles, List<Fragment> fragments) {
        super(supportFragmentManager);
        this.fgs = fragments;
        this.titles = titles;
        this.fm = supportFragmentManager;
       
    }

    public void setFragments(List<Fragment> fragments) {
        if(this.fgs != null){
            FragmentTransaction ft = fm.beginTransaction();
            for(Fragment f:this.fgs){
                ft.remove(f);
            }
            ft.commit();
            ft=null;
            fm.executePendingTransactions();
        }
        this.fgs = fragments;
        notifyDataSetChanged();
    }


    @Override
    public Fragment getItem(int position) {
        return fgs.get(position);
    }


    public CharSequence getPageTitle(int position) {
        return titles[position];
    }


    @Override
    public int getCount() {
        if (titles == null) return 0;
        return titles.length;
    }
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值