国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ViewPager+FragmentPagerAdapter刷新

2019-11-06 09:57:57
字體:
來源:轉載
供稿:網友

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 玉山县| 扶绥县| 邵阳县| 黄梅县| 定陶县| 冷水江市| 海城市| 苍南县| 县级市| 明光市| 通化市| 济宁市| 句容市| 安阳市| 怀仁县| 勐海县| 延津县| 亳州市| 延吉市| 安义县| 姚安县| 沅陵县| 台州市| 上犹县| 广西| 刚察县| 白朗县| 基隆市| 岳普湖县| 科技| 莒南县| 北宁市| 河北省| 洪洞县| 迁西县| 沽源县| 承德县| 剑川县| 余庆县| 太仓市| 涞源县|