2013-08-23 35 views
1

在我的應用程序中,我嘗試使用putSerializable方法在onSaveInstanceState中保存ArrayList狀態。並在onCreate和onRestoreInstanceState中恢復它。在我的應用程序中,如果沒有保存此對象的實例,它將從互聯網數據創建。但是我一直嘗試測試這個解決方案ArrayList開始從網絡下載。 任何人都可以幫助我嗎?無法在android中保存實例狀態

public class Activity extends SherlockActivity { 

ListView listView; 
SlidingMenu slidingMenu; 
ArrayList<HashMap<String, String>> newsList = null; 
String url = "/////here_my_url////"; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    getActionBar().setDisplayHomeAsUpEnabled(true); 
    getActionBar().setTitle(R.string.news_vatican); 
    listView = (ListView) findViewById(R.id.newslist); 

    slidingMenu = new SlidingMenu(this); 
    slidingMenu.setMode(SlidingMenu.LEFT); 
    slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); 
    slidingMenu.setFadeDegree(0.35f); 
    slidingMenu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT); 
    slidingMenu.setMenu(R.layout.slidingmenu); 
    slidingMenu.setBehindOffset(150); 

    if (savedInstanceState != null){ 
     newsList = (ArrayList<HashMap<String, String>>) savedInstanceState.getSerializable("list"); 
     Log.e("Activity", "RESTORING"); 
    } else { 
     Log.e("Activity", "PARSING NEW"); 
     JSONParser parser = new JSONParser(this); 
     parser.execute(url); 
     try { 
      newsList = parser.get(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
      Log.e("Activity", "Failed to get newslist"); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
      Log.e("Activity", "Failed to get newslist"); 

     } 

    } 


    listView.setAdapter(new NewsAdapter(getApplicationContext(), newsList)); 

} 

@Override 
protected void onSaveInstanceState(Bundle savedInstanceState) { 
    savedInstanceState.putSerializable("list", newsList); 
    super.onSaveInstanceState(savedInstanceState); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 

     newsList = (ArrayList<HashMap<String, String>>) savedInstanceState.getSerializable("list"); 

} 
+0

恢復狀態和持久數據是有區別的。即使將設備從縱向旋轉到橫向(反之亦然),是否再次下載ArrayList? – Vikram

+0

我只在我的應用程序中使用肖像方向android:configChanges =「orientation」 android:screenOrientation =「portrait」 – kostya17

+0

那麼,在這種情況下,'onSaveInstanceState(Bundle)'對你來說是沒用的。您需要的是一種在後續啓動中保留數據的方法。我對麼? – Vikram

回答

0

如果列表不是太大,一個簡單的選擇是將其保存到共享首選項。但是,您需要序列化ArrayList,因爲您只能存儲字符串。

你可以嘗試這樣的事情在你的onSaveInstanceState() ...

  1. 得到一個SharedPreferences編輯
    SharedPreferences.Editor editor = getSharedPreferences("shared_preferences", 0).edit();
  2. 加入你的價值
    editor.putString("myList", serialize(myList));
  3. 提交更改
    editor.commit()

後來的後來,你可以在任何地方訪問此列表,如您onCreate()方法,即使你的活動已經做

SharedPreferences preferences = getSharedPreferences("shared_preferences",0); 
ArrayList<HashMap<String,String>> newsList = deserialize(preferences.getString("newsList", ""); 

再次被殺,這需要創造方法的額外工作序列化和反序列化你的ArrayList,但它肯定是一個簡單的選擇,如果這是你需要堅持的唯一數據。