ViewPager+FragmentPagerAdapter刷新

来源:互联网 发布:抠图算法 编辑:程序博客网 时间:2024/06/10 16:25

ViewPager+FragmentPagerAdapter刷新

一、全刷新

百度好多都是说在继承FragmentPagerAdapter的类里重写getItemPosition()方法,能刷新所有fragment。
@Overridepublic 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;@Overridepublic 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,不需要重新创建,以此记录,互相学习,有更好的方法请留链接!

0 0