我正在编写一个应用程序,需要从用户那里获取输入,将其传递给服务器,该服务器返回一个JSON字符串,然后在ListView中显示其解析的内容。我正在通过扩展AsyncTask来实现这一目标:
//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();
}
}
}
(这是我的第一篇文章,所以如果我试图让代码块失败,我会提前道歉)
在onPostExecute方法中,在设置listItems等于items之后,如果我打印listItems的内容,它们就是我想要的。但是,由于某种原因,当从onPostExecute执行时,adapter.notifyDataSetChanged()似乎什么都不做(当它从主线程调用时,它工作正常)。
如果有人知道发生了什么和/或如何解决它,我真的很感激。谢谢!
答案 0 :(得分:21)
protected void onPostExecute(ArrayList<String> items) {
listItems.clear();
listItems.addAll(items);
adapter.notifyDataSetChanged();
}
我希望你已经在做这件事了
adapter = new ArrayAdapter<String>(listItems);