@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 来存储一下tagprivate 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,不需要重新创建,以此记录,互相学习,有更好的方法请留链接!
新闻热点
疑难解答