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,不需要重新创建,以此记录,互相学习,有更好的方法请留链接!