1

我有一個FragmentPagerAdapter的問題。Android:FragmentPagerAdapter不保存Fragment的狀態?

我無法保存該片段的狀態,然後有觀點,該片段內。每當我左右使用滑動條時,通過覆蓋擴展FragmentPagerAdapter的靜態類中的方法getItem(int position)來重新創建片段。

public static class GraphicsCollectionPagerAdapter extends FragmentPagerAdapter { 

    final int NUM_ITEMS = 3; // number of tabs 

    public GraphicsCollectionPagerAdapter(FragmentManager fm) { 

     super(fm); 
     fragmentList = new AnalyzeFragmentPageListWithDate(); 
     fragment1 = new AnalyzeFragmentPage1(); 
     fragment2 = new AnalyzeFragmentPage2(); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     //Log.i(TAG, "getItem() -> New fragment at position " + position); 


     switch (position) { 

     case 0:   
      return fragmentList; 
     case 1: 
      return fragment1; 
     case 2: 
      return fragment2; 
     } 
     return null; 
    } 

    @Override 
    public int getCount() { 
     return 3; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 

     switch (position) { 

     case 0: 
      return "Fragm1"; 
     case 1: 
      return "Fragm2"; 
     case 2: 
      return "Fragm3"; 

    } 
     return "OBJECT " + (position + 1); 
    } 


} 

在該片段的每個實例的方法OnCreateView有幾個步驟來SQLite數據庫,這將導致數據庫連接池的飽和。 「W/SQLiteConnectionPool(1111):數據庫'/ data/data/com.myapp/databases/mydb'的SQLiteConnection對象被泄露了!請修復您的應用程序以結束事務正在進行正常和關閉數據庫時,它不再需要它。「

我已經嘗試過使用FragmentStatePagerAdapter沒有成功。

您能否告訴我如何繼續?我不希望每次都會重新生成碎片,導致數據庫出現問題。你有保存片段/視圖狀態的例子嗎?

我現在還沒有找到任何建議。 非常感謝你

+0

你有你的片段列表視圖? – playmaker420

+0

我有列表視圖和條形圖。謝謝 – GlassExplorer89

+0

我有類似的問題,第一個片段中的listview在來自第三個片段後重新加載。我做的是,我用listFragment替換了Fragment,並使用了SimpleCursorAdapter和LoaderManager.LoaderCallbacks 來填充列表視圖 – playmaker420

回答

0

首先創建的Fragment一個新實例每次getItem()被稱爲

@Override 
public Fragment getItem(int position) { 
    switch (position) { 
    case 0:   
     return new FragmentList(); 
    case 1: 
     return new AnalyzeFragmentPage1(); 
    case 2: 
     return new AnalyzeFragmentPage2(); 
    } 
    return null; 
} 

注意FragmentPagerAdapter並不像正常Adapter工作完全意味着它不會使用空容器時Fragment然後用不同的數據重新填充它。

而是創建時,它需要新的Fragment。所以你應該在創建Fragment時傳遞數據(如果有的話)。請在Android文檔中研究example

在一個實時的項目,而不是通過當前位置到新Fragment你可以傳遞一個Fragment應參照項的實際ID

5

使用ViewPager對象的setOffscreenPageLimit屬性。

ViewPager pager = (ViewPager) findViewById(R.id.viewPagerId); 
pager.setOffscreenPageLimit(2);