天天看点

ViewPager+FragmentPagerAdapter刷新ViewPager+FragmentPagerAdapter刷新

ViewPager+FragmentPagerAdapter刷新

一、全刷新

百度好多都是说在继承FragmentPagerAdapter的类里重写getItemPosition()方法,能刷新所有fragment。

@Override
public int getItemPosition(Object object) {
   return POSITION_NONE;
}      

源码是这样说的:

{@link #POSITION_UNCHANGED} if the object's position has not changed,
*         or {@link #POSITION_NONE} if the item is no longer present.      

当返回POSITION_UNCHANGED时,认为没有改变,于是不刷新; 返回POSITION_NONE时,认为不存在,则重新创建。 但是,本人使用无效,原因不详,于是我想,反正都是重新创建,那我移除后再创建不是一个道理吗,然后有了以下代码:

viewPager.removeAllViews();
mainPagerAdapter = new MainPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(mainPagerAdapter);      

现实证明有效。当然,很多人会说这样浪费资源,所以这种方法应在不讲究铺张浪费的时候使用! 若结合PagerSlidingTab使用,要加上:

viewPager.removeAllViews();
slidingTab.removeView(viewPager);
mainPagerAdapter = new MainPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(mainPagerAdapter);
slidingTab.setViewPager(viewPager);      

二、单刷新

存在铺张浪费,当然就有勤俭节约!

1、为每个fragment添加标识

首先,在创建fragment的java类中定义一个List<String> tagLists 来存储一下tag

private List<String> tagLists;      

然后重写FragmentPagerAdapter的instantiateItem()方法,PagerAdapter在该方法中通过事务添加片段,所以要在该方法中存tag:

public Object instantiateItem(ViewGroup container, int position) {
   tagLists.add(makeFragmentName(container.getId(), (int) getItemId(position)));
   return super.instantiateItem(container, position);
}
public static String makeFragmentName(int viewId, int index) {
   return "android:switcher:" + viewId + ":" + index;
}      

2、指定更新的fragment

在继承FragmentPagerAdapter的java类中写一个update()方法

public void update(int item) {
   Fragment fragment = fm.findFragmentByTag(tagLists.get(item));
   if (fragment != null) {
      switch (item) {
         case 0:
            ((FragmentA) fragment).query();
            break;
         case 1:
            ((FragmentB) fragment).query();
            break;
         case 2:
            ((FragmentC) fragment).query();
            break;
      }
   }
}      

query() 方法是用于接口回调机制更新指定fragment要使用的方法。

3、定义回调接口

public interface FragmentListener {
    void onFragmentRefreshListener(int item);
}      

ViewPager所在的Activity继承该接口,实现方法:

public void onFragmentRefreshListener(int item) {
        //mainPagerAdapter为我们自定义的适配器对象
        mainPagerAdapter.update(item);
//        mainPagerAdapter.update(item);
    }      

要更新多少个fragment,就写多少

mainPagerAdapter.update(item);      

fragment中重写onAttach()方法。

public static FragmentListener listener;
@Override
public void onAttach(Activity activity) {
    listener = (FragmentListener) activity;
    super.onAttach(activity);
}      

4、调用监听方法

在需要更新的地方调用:

if (FragmentA.listener != null) {
    //Fragment自身刷新
    FragmentA.listener.onFragmentRefreshListener(0);
    //另一个Fragment刷新
    FragmentA.listener.onFragmentRefreshListener(1);
}      

其中0是FragmentA的item值,依此类推,1是FragmentB的,这里意思为更新FragmentA触发,同时更新FragmentA和FragmentB。

到此即可选择性更新Fragment,不需要重新创建,以此记录,互相学习,有更好的方法请留链接!

继续阅读