2010-09-08 5 views
2

J'écris après l'application:notifyDataSetChanged ne fonctionne pas?

  • il y a un champ AutoCompleteTextView
  • comme adaptateur J'utilise ArrayAdapter avec ListArray
  • la ListArray se compose d'un certain élément de chaîne constante et un élément qui sera modifié de manière dynamique chaque utilisateur a tapé quelque chose dans le champ

J'ai pris TextChangedListener pour mettre à jour ce dernier élément de la liste. Mais il semble que cette mise à jour ne se produise qu'une seule fois.

J'ajoute un code de moi. Peut être quelqu'un peut me montrer, qu'est-ce que je fais mal.

public class HelloListView extends Activity 
{ 
    List<String> countryList = null;  
    AutoCompleteTextView textView = null; 
    ArrayAdapter adapter = null; 

    static String[] COUNTRIES = new String[] 
    { 
      "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", 
      "Yemen", "Yugoslavia", "Zambia", "Zimbabwe", "" 
    }; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main);   

     countryList = Arrays.asList(COUNTRIES); 

     textView = (AutoCompleteTextView) findViewById(R.id.edit); 
     adapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, countryList); 
     adapter.notifyDataSetChanged();   
     textView.setAdapter(adapter); 
     textView.setThreshold(1); 

     textView.addTextChangedListener(new TextWatcher() 
     { 

      public void onTextChanged(CharSequence s, int start, int before, int count) 
      {    
       countryList.set(countryList.size()-1, "User input:" + textView.getText());     
      } 

      public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) 
      {    
      } 

      public void afterTextChanged(Editable s) 
      { 
      } 
     }); 

     new Thread() 
     { 
      public void run() 
      { 
       // Do a bunch of slow network stuff. 
       update(); 
      } 
     }.start();   
    } 

    private void update() 
    { 
     runOnUiThread(new Runnable() 
     { 
      public void run() 
      { 
       adapter.notifyDataSetChanged(); 
      } 
     }); 
    } 
} 
+0

Vous ne savez pas pourquoi ce que vous avez ne fonctionne pas, mais avez-vous envisagé d'utiliser AsyncTask pour effectuer vos tâches réseau? Il vous donne un moyen facile de travailler sur un autre thread, puis faire un peu de travail sur le thread de l'interface utilisateur lors de son doen. http://developer.android.com/reference/android/os/AsyncTask.html –

+0

Mais si vous regardez mon exemple, il n'y a pas du tout de réseau. J'ai les données de ArrayList déjà dans le code. – Tima

+0

a essayé votre suggestion. Cela ne fonctionne pas – Tima

Répondre

11

Ne modifiez pas le ArrayList. Modifiez le ArrayAdapter en utilisant add(), insert() et remove(). Vous n'avez pas besoin de vous soucier de notifyDataSetChanged().

En outre, je suis d'accord avec Mayra - envisager d'utiliser AsyncTask au lieu de votre fil et runOnUiThread() combinaison.

+0

J'ai une suggestion pour utiliser runOnUIThread by stackoverflow. ajouter, insérer et supprimer opération ne sont pas très gentils dans mon cas. Je voudrais avoir un seul article, je vais changer. – Tima

2

Dans la fonction onTextChanged(), créez un nouvel adaptateur et le joindre, il va travailler:

countryList.set(countryList.size()-1, "User input:" + textView.getText());  
adapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, countryList); 
textView.setAdapter(adapter); 

On peut dire qu'elle est pas parfait, mais ça marche!

+0

merci pour l'aide! – DigaoParceiro