2010-02-26 4 views
3

comme ci-dessus, est-ce fait automatiquement? Ma liste était vide une fois l'orientation chMYanges? et Nope, j'ai besoin du changement d'orientation =)android: comment est-ce que je conserve les données dans mon arrayadapter/listview quand change l'orientation?

Mon adaptateur

public class ResultsAdapter extends ArrayAdapter<SearchItem> implements Filterable{ 

private ArrayList<SearchItem> subItems; 
private ArrayList<SearchItem> allItems;// = new ArrayList<SearchItem>(); 
private LayoutInflater inflater; 
private PTypeFilter filter; 
private OnCheckedChangeListener test; 

public ResultsAdapter(Context context, int textViewResourceId, ArrayList<SearchItem> items,OnCheckedChangeListener a) { 

    super(context, textViewResourceId, items); 
     //this.subItems = items; 
     for(int i = 0;i < items.size();i++){ 
      subItems.add(items.get(i)); 
     } 
     this.allItems = this.subItems; 
     inflater= LayoutInflater.from(context); 

     test = a; 
} 

Mon onCreate

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



    ListView lvr = (ListView)findViewById(R.id.search_results); 



    // if(savedInstanceState == null){ 
     this.m_adapter = new ResultsAdapter(home.this, R.layout.listrow, sResultsArr,home.this); 
     this.specsAdapter = new FeaturesExpandableAdapter(home.this,new ArrayList<String>(),new ArrayList<ArrayList<Feature>>()); 
    // } 
     lvr.setAdapter(this.m_adapter); 

Merci les gars

+2

"persévérer"? J'ai d'abord lu "pervers" (désolé), mais je suppose que vous voulez dire "préserver";) – Lucero

+1

oui je veux dire préserver. – joejy

Répondre

20

Vous pouvez également utiliser http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance()

Quelque chose comme ça dans votre activité:

@Override 
public Object onRetainNonConfigurationInstance() { 
    return this.m_adapter.getItems(); 
} 

Et puis dans votre onCreate():

@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 

    // more init stuff here 

    sResultsArr = (ArrayList<SearchItems>)getLastNonConfigurationInstance(); 
    if(sResultArr == null) { 
     sResultsArray = new ArrayList<SearchItems>(); // or some other initialization 
    } 

    self.m_adapter = new ResultsAdapter(home.this, R.layout.listrow, sResultsArr,home.this); 

    // ... 
} 
+0

merci synonyme que cela fonctionne très bien! – joejy

+8

Ni 'ArrayAdapter' ni ses classes parentes n'ont de méthode' getItems'. Qu'est-ce que j'oublie ici? –

+2

Notez que sur les récentes versions Android (au moins 4.0) cette pratique est fortement déconseillée. – Mgamerz

-1

Les données ne doivent pas être perdues lorsque vous modifiez l'orientation. La seule chose que je peux imaginer est que la disposition de votre activité n'est pas correcte, comme, les contrôles sortent de la zone visible en changeant l'orientation.

+0

Cela semble très possible, ou peut-être que les données utilisées pour remplir la liste sont détruites avec l'activité de changement d'orientation mais ne sont pas recréées? –

+0

salut thorsten, est-ce dû au fait que j'ai réellement utilisé un arrayadapter personnalisé pour afficher et stocker les données que l'état de l'adaptateur n'est pas sauvé? Dois-je initier mon adaptateur dans onCreate()? – joejy

+0

salut jack je suppose, parce que j'avais une exception nullpointer à mon adaptateur quand j'ai changé mon orientation. Quelle peut être la raison pour laquelle mon adaptateur ne recréera pas? – joejy

5

Si vous avez des données en mémoire qui doivent rester en place pendant un changement d'orientation, vous devez faire quelque chose pour organiser cela. La meilleure solution consiste à implémenter onSaveInstanceState() et à l'utiliser pour stocker vos données, car cela ne sert pas seulement aux changements d'orientation, mais aussi à d'autres situations (par exemple, votre activité est sur la pile actuelle, mais elle doit être expulsée de la RAM libérer de l'espace pour les choses plus tard dans la pile).

+0

onsaveinstancestate Je ne peux enregistrer que des paires nom-valeur. Puis-je savoir comment conserver l'objet lui-même? – joejy

+4

Via 'onSaveInstanceState()', vous ne pouvez pas, car votre processus peut être détruit (voir par exemple dans ma réponse). Vous pouvez utiliser 'onRetainNonConfigurationInstance()' pour conserver un objet arbitraire lors d'un changement d'orientation, mais gardez à l'esprit que cela ne gère que * seulement * les changements d'orientation, pas les scénarios où votre activité est expulsée de la RAM. – CommonsWare

1

Je pense que vous êtes sur le mauvais façon. S'il vous plaît prendre le temps de voir cette vidéo des développeurs Android: http://www.youtube.com/watch?v=wDBM6wVEO70 (environ 1 heure).

J'ai suivi la vidéo, et mon point de vue de la liste fonctionne très bien lorsque l'écran change d'orientation :-)

-5

S'il vous plaît mettre ce code dans votre fichier AndroidManifest.xml.

activity 
     android:name="MainActivity" 
     android:label="@string/app_name" 
     android:configChanges="keyboardHidden|orientation|screenSize" 
+2

c'est bidouille terrible, mieux apprendre à stocker des données sur les changements de configuration! – pelotasplus

0

Je résolu ce problème en utilisant OnSaveInstanceState() et OnRestoreInstanceState()

@Override 
    protected void onRestoreInstanceState(Bundle state){ 
     super.onRestoreInstanceState(state); 
     name_array.addAll(state.getStringArrayList("key")); 
     setListAdapter(arrayAdapter); 
     arrayAdapter.notifyDataSetChanged(); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState){ 
     super.onSaveInstanceState(outState); 
     outState.putStringArrayList("key",name_array); 
    } 

name_array est en tenir ArrayAdapter arrayAdapter = new ArrayAdapter<String>(this ,R.layout.item,name_array);

Maintenant, quand vous changez de paysage à portrait et inverse, les données ne sont pas los

Questions connexes