2011-10-06 15 views
9

Sto scrivendo un'app che richiede l'input dell'utente, la sua trasmissione ad un server, che restituisce una stringa JSON e quindi visualizza i suoi contenuti analizzati in un ListView. Attualmente sto realizzando questo AsyncTask estendendo:Adattatore Android.notifyDataSetChanged() non funziona?

//stripped down version 
public class main extends ListActivity { 

ArrayList<String> listItems = new ArrayList<String>(); 
ArrayAdapter<String> adapter; 
final EditText input = (EditText)findViewById(R.id.input); 


input.addTextChangedListener(new TextWatcher() {  
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if(!input.getText().toString().equals("")) { 
      new GetDataTask().execute(input.getText().toString()); 
     } 

    } 
}); 

private class GetDataTask extends AsyncTask<String, Void, ArrayList<String>> { 
     protected ArrayList<String> doInBackground(String... query) { 

     URL url = new URL("http://myserversaddressgoeshere.com/search/thequerygoeshere"); 
     URLConnection conn = url.openConnection(); 
     BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
      ArrayList<String> items = new ArrayList<String>(); 
     //the code that parses the JSON goes here; it writes some strings to items 
     return items; 
     } 

     protected void onPostExecute(ArrayList<String> items) { 
      listItems = items; 
     adapter.notifyDataSetChanged(); 
     } 
} 

} 

(Questo è il mio primo post quindi mi scuso in anticipo se il mio tentativo di fare che un blocco di codice non riesce)

Nel metodo OnPostExecute, dopo l'impostazione listItem uguale agli elementi, se stampo il contenuto di listItems, sono esattamente ciò che voglio. Ma, per qualche ragione, quando eseguito da onPostExecute, adapter.notifyDataSetChanged() sembra non fare nulla (quando viene chiamato dal thread principale, funziona bene).

Se qualcuno ha qualche idea di cosa sta succedendo e/o come risolverlo, lo apprezzerei molto. Grazie!

risposta

21

si può provare questo

protected void onPostExecute(ArrayList<String> items) { 
     listItems.clear(); 
     listItems.addAll(items); 
     adapter.notifyDataSetChanged(); 
    } 

e spero che si sta già facendo qualcosa di questo

adapter = new ArrayAdapter<String>(listItems); 
+0

whoops, ho lasciato che la dichiarazione fuori. adattatore = nuovo ArrayAdapter (questo, \t \t android.R.layout.simple_list_item_1, listItems); –

+0

hai provato ** clear() ** e ** addAll() ** – Samuel

+0

E quello ha funzionato; Grazie mille! Per curiosità, sai perché clear -> addAll -> notifyDSC funziona, ma quello che ho fatto non lo fa? –

Problemi correlati