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!
Ups, zostawiłem tę deklarację na zewnątrz. adapter = nowy ArrayAdapter (to, \t \t android.R.layout.simple_list_item_1, listItems); –
czy próbowałeś ** clear() ** i ** addAll() ** – Samuel
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? –