2011-10-06 17 views
9

Piszę aplikację, która wymaga uzyskania danych wejściowych od użytkownika, przekazując go do serwera, który zwraca ciąg JSON, a następnie wyświetlając jego analizowaną zawartość w widoku listy. Jestem obecnie zrealizować to poprzez rozszerzenie AsyncTask:Android adapter.notifyDataSetChanged() nie działa?

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

} 

(To jest mój pierwszy post więc przepraszam z góry jeśli moja próba dokonania że blok kodu nie powiedzie)

W metodzie onPostExecute, po ustawieniu listItems równe elementom, jeśli wydrukuję zawartość listItems, są dokładnie tym, czego chcę. Ale z jakiegoś powodu, gdy wykonywany z onPostExecute, adapter.notifyDataSetChanged() wydaje się nic nie robić (gdy jest wywoływany z głównego wątku, działa dobrze).

Jeśli ktoś ma pojęcie o tym, co się dzieje i/lub jak to naprawić, byłbym bardzo wdzięczny. Dzięki!

Odpowiedz

21

można spróbować to

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

i mam nadzieję, że już robisz coś tak

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

Ups, zostawiłem tę deklarację na zewnątrz. adapter = nowy ArrayAdapter (to, \t \t android.R.layout.simple_list_item_1, listItems); –

+0

czy próbowałeś ** clear() ** i ** addAll() ** – Samuel

+0

I to zadziałało; Dziękuję Ci bardzo! Czy z ciekawości wiesz dlaczego clear -> addAll -> notifyDSC działa, ale co ja nie mam? –