2013-04-02 33 views
1

我使用GridView控件動態加載數據到我的活動:恢復GridView的方向更改後的數據

private ArticuloAdapter articuloAdapter; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);    
    setContentView(R.layout.grid_articulos); 

    // get ListaArticulos from the database 

    articuloAdapter = new ArticuloAdapter(this,R.layout.lista_articulo, ListaArticulos); 
    grdArticulos.setAdapter(articuloAdapter); 
} 

而且我希望有一個方向更改後恢復數據:

ArrayList<String> articulosBackup = new ArrayList<String>(); 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState);    
    int size = grdArticulos.getChildCount(); 
    for(int i = 0; i < size; i++) { 
     ViewGroup layout = (ViewGroup) this.grdArticulos.getChildAt(i); 
     ViewGroup gridChild = (ViewGroup) layout.getChildAt(1);  

     EditText et =(EditText)gridChild.getChildAt(0).findViewById(R.id.Cantidad);   
     EditText et2 = (EditText)gridChild.getChildAt(1).findViewById(R.id.jaulas);   
     EditText et3 =(EditText)gridChild.getChildAt(2).findViewById(R.id.contenedores);   
     CheckBox cb = (CheckBox)gridChild.getChildAt(3).findViewById(R.id.manipulado); 

     String dato = et.getText().toString() + ":" + et2.getText().toString() + ":" + et3.getText().toString() + ":" + String.valueOf(cb.isChecked()); 
     articulosBackup.add(dato); 
    } 
    outState.putSerializable("articulosBackup", articulosBackup); 
    outState.putInt("items", size); 
} 

我將數據以字符串形式保存在ArrayList中,格式爲:data1:data2:data3:data4。 這很好。但現在,當我試圖還原他們我NullPointerException異常的行被註釋掉:

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

    articulosBackup = (ArrayList<String>)savedInstanceState.getSerializable("articulosBackup"); 
    items   = savedInstanceState.getInt("items");  

    if (articulosBackup != null) {   
     for(int i = 0; i < items; i++) { 
      ViewGroup layout = (ViewGroup) grdArticulos.getChildAt(i); 
      ViewGroup gridChild = (ViewGroup) layout.getChildAt(1); // NULLPOINTEREXECPTION: layout variable is null 

      String datos[] = articulosBackup.get(i).split(":"); 

      // Cantidad 
      EditText et =(EditText)gridChild.getChildAt(0).findViewById(R.id.Cantidad); 
      et.setText(datos[0]); 

      // Jaulas 
      EditText et2 = (EditText)gridChild.getChildAt(1).findViewById(R.id.jaulas); 
      et2.setText(datos[1]); 

      // Contenedores 
      EditText et3 =(EditText)gridChild.getChildAt(2).findViewById(R.id.contenedores); 
      et3.setText(datos[2]); 

      // Manipulado 
      CheckBox cb = (CheckBox)gridChild.getChildAt(3).findViewById(R.id.manipulado); 
      cb.setChecked(Boolean.parseBoolean(datos[3])); 
     } 
    } 
} 

所以我的問題是:我怎麼能更改方向後恢復我的動態GridView的?謝謝。

回答

1

您的保存和恢復方法應該用於小數據,比如原始值。對於像arraylist,數據庫這樣的大型數據集,您應該重寫onRetainNonConfigurationInstance()並返回該對象。

注意:雖然您可以返回任何對象,但您絕不應該傳遞與該活動綁定的對象,例如Drawable,適配器,視圖或與Context關聯的任何其他對象。如果這樣做,它會泄漏原始活動實例的所有視圖和資源。 (泄漏資源意味着您的應用程序會保留它們,並且它們不能被垃圾收集,因此可能會丟失大量內存)。

您應該重寫onRetainNonConfigurationInstance()並返回數組列表。

欲瞭解更多信息,請看這裏的鏈接。 http://developer.android.com/guide/topics/resources/runtime-changes.html

@Override 
public Object onRetainNonConfigurationInstance() { 

return arraylist;//return arraylist 
} 

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

final ArrayList data = (ArrayList) getLastNonConfigurationInstance(); 
if (data == null) { //if data is null populate data to arraylist. 
//do something 
} 
// use arraylist 
} 

一旦方向更改活動重新創建。所以返回onRetainNonConfigurationInstance()中的值。在onCreate()提供返回的值。

例子:

 @Override 
    public Object onRetainNonConfigurationInstance() { 

    return mPostingData; 
    } 

在的onCreate()

final ArrayList data = (ArrayList) getLastNonConfigurationInstance(); 
     if (data == null) { 
      System.out.println("data is null"); 
     //populate arraylist with values. 
     } 
     else 
     { 
      for(int i=0;i<data.size();i++) 
      System.out.println("data is not null..."+data.get(i)); 
     } 
+0

謝謝,我已經實現了你的解決方案,但在GridView不加載我存儲的數據。 arrayList完美地保存數據。 –

+0

@enrmarc。一旦arraylist保存數據,最終的ArrayList數據=(ArrayList)getLastNonConfigurationInstance();.數據是返回的數組列表。如果它的null再次加載。如果不使用相同的 – Raghunandan

+0

對不起,我的'ArticuloAdapter'是錯誤的(它沒有設置數據)。非常感謝你。 –

相關問題