2011-10-06 52 views
9

Estoy escribiendo una aplicación que requiere la entrada del usuario, la pasa a un servidor, que devuelve una cadena JSON, y luego muestra su contenido analizado en un ListView. Actualmente estoy lograr esto mediante la extensión de AsyncTask:Android adapter.notifyDataSetChanged() no funciona?

//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(); 
     } 
} 

} 

(Este es mi primer post así que me disculpo de antemano si mi intento de hacer que un bloque de código falla)

En el método onPostExecute, después de ajustar listItems iguales a elementos, si imprimo los contenidos de listItems, son exactamente lo que quiero. Pero, por alguna razón, cuando se ejecuta desde onPostExecute, adapter.notifyDataSetChanged() parece no hacer nada (cuando se llama desde el hilo principal, funciona bien).

Si alguien tiene alguna idea de lo que está pasando y/o cómo solucionarlo, realmente lo agradecería. ¡Gracias!

Respuesta

21

puede usted probar este

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

y espero que ya está haciendo algo esta

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

gritos, me dejaron que la declaración fuera. adapter = new ArrayAdapter (esto, \t \t android.R.layout.simple_list_item_1, listItems); –

+0

intenté ** clear() ** y ** addAll() ** – Samuel

+0

Y funcionó; ¡Muchas gracias! Por curiosidad, ¿sabes por qué claro -> addAll -> notifyDSC funciona, pero lo que tenía no? –