2012-08-23 26 views
0

我一直在試圖弄清楚是什麼導致我的應用程序丟失兩個ListView中的數據,兩個選項卡中的每一箇中都有一個,這兩個都是ListFragment s。當您將應用帶到最前沿時,ListView s在手機上隨機排空。Android生命週期 - 數據不重新加載

我猜想我錯過了如何恢復數據時,將備份應用程序。通常,應用程序還原並且兩個選項卡中的數據都存在。

但是,只有在真實的手機上,數據將從ListView s消失,但我找不到可重複的模式。

我用DDMS模擬了很多組合中的垃圾收集,我無法重現數據的丟失。下面是我如何處理生命週期,簡化和基本全部的僞代碼。

我已經看過生命週期結構,並認爲我有它的工作。

我刷新不正確?

主要活動

public class MyActivity extends FragmentActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // I don't refresh here 
     // add both tabs to the tab adapter 
    } 

    public void onRestart() { 
     super.onRestart(); 
     reloadTab1(); 
     reloadTab2(); 
    } 
} 

標籤1

public class MyTab1 extends ListFragment { 
    static MyTab1Adapter mAdapter; 
    ArrayList<MyObject> mItems; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // retain state 
     setRetainInstance(true); 
     reloadTab1(getActivity()); 
    } 

    public void reloadTab1(Context context) { 
     mItems = updateItems(); 

     if (mAdapter == null) { 
      mAdapter = new MyTab1Adapter(context, R.layout.tab1, mItems); 
      setListAdapter(mAdapter); 
     }   
     else { 
      mAdapter.setNewList(mItems); 
      mAdapter.notifyDataSetChanged(); 
     } 
    } 
} 

標籤2

public class MyTab2 extends ListFragment { 
    static MyTab2Adapter mAdapter; 
    ArrayList<MyObject> mItems; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // retain state 
     setRetainInstance(true); 
     reloadTab2(getActivity()); 
    } 

    public void reloadTab2(Context context) { 
     mItems = updateItems(); 

     if (mAdapter == null) { 
      mAdapter = new MyTab2Adapter(context, R.layout.tab2, mItems); 
      setListAdapter(mAdapter); 
     }   
     else { 
      mAdapter.setNewList(mItems); 
      mAdapter.notifyDataSetChanged(); 
     } 
    } 
} 
+1

只是我猜錯了,但'onRestart'並調用'super.onResume()'? – Luksprog

+0

我其實只是注意到這是我的應用程序中的一個錯誤。也許這會解決它,我們會看到。好趕上 – Kirk

+0

如果您使用'onRestart',那麼回調將不會被調用,除非活動在後臺被殺害。每次都會調用onResume,因此每次返回活動時都應刷新片段。 – Luksprog

回答

1

你必須在你的鱈魚小錯字e,你使用onRestart回調,但從超級類別中調用onResume方法而不是super.onRestart();