2010-06-11 11 views
0

La mise en page est basique: un EditText en haut suivi d'un ListView. EditText a un TextWatcher.onTextChanged implémenté de sorte que ArrayAdapter.getFilter.filter est appelé avec le texte entré. Les données de ArrayAdapter sont actualisées de manière asynchrone lors de la reprise (voir l'extrait de code ci-dessous). Assez facile, fonctionne bien aussi ... jusqu'à ce que l'orientation de l'écran est modifiée. Pourquoi le filtrage se briserait-il soudainement lorsque le téléphone est tourné de côté?Pourquoi ArrayAdapter ne filtre-t-il pas correctement après le changement d'orientation de l'écran?

public class SometActivity extends ListActivity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     ... 
     listAdapter = new ArrayAdapter<MemoryStatistic>(this, R.layout.list_item); 
     setListAdapter(listAdapter); 
     searchText = (EditText)findViewById(R.id.searchText); 
     searchText.addTextChangedListener(new TextWatcher() 
     { 
      @Override 
      public void onTextChanged(CharSequence text, int start, int before, int count) 
      { 
       listAdapter.getFilter().filter(text); 
      } 
      ... 
     } 
     ... 
    } 

    @Override 
    protected void onResume() 
    { 
     asyncRefreshListAdapter();//refresh the data asynchronously when activity is resumed 
    } 
} 

Répondre

1

Je pensais que je ferais ce poste auto-réponse en cas d'autres programmeurs qui sont nouveaux dans le développement Android (comme je suis) devenir déconcerté par cela. Ainsi, selon android reference onResume ne sera appelée que si l'activité est

1) créé

2) redémarrés

3) a repris (mis en avant-plan après la reprise)

Ok, alors qu'est-ce l'orientation de l'écran ont à voir avec cela? Eh bien, la plupart des développeurs qui lisent la documentation la parcourent en raison du fait qu'il y a beaucoup à lire et qu'ils veulent juste mettre en œuvre quelque chose de cool. Je n'étais pas différent. Si seulement je l'avais lu plus loin, je l'aurais évité beaucoup de maux de tête plus tard:

Sauf indication contraire, un changement de configuration (par exemple un changement d'orientation de l'écran, la langue, les périphériques d'entrée, etc.) seront cause que votre activité actuelle soit détruite

Et maintenant, il est évident que le filtre ne fonctionnerait pas correctement. Le problème était que (une fois que l'activité avait été détruite à l'écran), listAdapter n'était pas entièrement ou pas du tout rempli (en raison de la nature asynchrone de l'actualisation) avant que le filtrage ne commence.

+0

Exactement, juste pour les autres qui arriveront ici: vous pouvez désactiver ce comportement par défaut en ajoutant 'orientation' à l'attribut' android: configChanges' de l'élément ''. * Mais * vous devrez gérer le changement d'orientation manuellement. Plus d'infos ici: http://developer.android.com/guide/topics/manifest/activity-element.html#config – andr