2014-07-23 84 views
0

我明白,viewpager的屏幕外頁面限制必須至少爲1.我試圖動態更改視圖頁面中的片段,因爲我一直在從服務器獲取信息。 例如,我在查看片段B時實例化片段A,B,C。 我想更改片段A的信息,因此我更新它並調用notifyDataSetChanged()。我沒有創建一個新的片段並將其插入到原來的位置,但改變了與原始片段關聯的圖像視圖。如何在實例化後在viewpager中替換片段?

但是,一旦我嘗試導航到A,我碰到一個錯誤說「片段是不是目前在FragmentManager」

任何人都可以向我解釋如何我能跳之間來回viewpager中的即時頁面,同時允許這些頁面更改其視圖?

回答

0

爲了做到這一點,你應該創建一個FragmentPagerAdapter,因爲他們所創建的保存到你的頁面的引用。事情是這樣的:

public class MyPagerAdapter extends FragmentPagerAdapter { 
    SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>(); 

    public MyPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position) 
     { 
     case 0: 
      return MyListFragment.newInstance(TAB_NAME_A); 
     case 1: 
      return MyListFragment.newInstance(TAB_NAME_B); 
     case 2: 
      return MyListFragment.newInstance(TAB_NAME_C); 
     default: 
      return null; 
     }   
    } 

    @Override 
    public int getCount() { 
     // Show 3 total pages. 
     return TOTAL_PAGES; 
    }  

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     Fragment fragment = (Fragment) super.instantiateItem(container, position); 

     registeredFragments.put(position, fragment); 

     return fragment; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     registeredFragments.remove(position); 

     super.destroyItem(container, position, object); 
    } 

    public Fragment getRegisteredFragment(int position) { 
     return registeredFragments.get(position); 
    } 
} 

您可以訪問特定頁面這樣的:

((MyListFragment) myPagerAdapter.getRegisteredFragment(0)).updateUI(); 

凡updateUI()是更新頁面上的名單,並呼籲notifyDataSetChanged()一個自定義的方法。

1

我沒有那樣做,但我的建議不會嘗試。 Android在底層做了很多魔術,很可能你會遇到很多試圖實現你想要的東西的問題。我有,當我試圖挽救內容查看每個列表項,從而使Android將使其只有一次的ListView的經驗,經過了整整一天我放棄了,因爲每次我已經改變了默認行爲的想法,新的東西來了(例如意見有兩個父母的例外情況)。我已經設法實現了,但代碼非常糟糕。

你爲什麼不嘗試,例如,保存您的光盤上下載的圖像,如果在片段實際出現在屏幕上檢索?畢加索庫可以在這種情況下幫助