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、调用监听方法
在需要更新的地方调用:
其中0是FragmentA的item值,依此类推,1是FragmentB的,这里意思为更新FragmentA触发,同时更新FragmentA和FragmentB。if (FragmentA.listener != null) { //Fragment自身刷新 FragmentA.listener.onFragmentRefreshListener(0); //另一个Fragment刷新 FragmentA.listener.onFragmentRefreshListener(1); }
到此即可选择性更新Fragment,不需要重新创建,以此记录,互相学习,有更好的方法请留链接!