@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,不需要重新創建,以此記錄,互相學習,有更好的方法請留鏈接!
新聞熱點
疑難解答