如何在完成异步任务时更新listivew。下面是示例代码,但listview未更新。
class CallXML extends AsyncTask<Void, Void, Void> {
int gcid;
int scid;
public CallXML(int gid, int sid) {
// TODO Auto-generated constructor stub
gcid = gid;
scid = sid;
}
protected void onPreExecute() {
}
protected Void doInBackground(Void... arg0) {
// here goes the xml parsing....
}
return null;
}
protected void onPostExecute(String result) {
Log.e("TAG", "In postExecute");
Cursor cur3 = database2.query("Quote", qfield, null, null, null, null, null);
cur3.moveToFirst();
do {
quotesarray.add(cur3.getString(2));
} while (cur3.moveToNext());
if(cur3 != null){
cur3.close();
}
QList.post(new Runnable() {
public void run() {
mAdapter = new CustomAdapter();
mAdapter.notifyDataSetChanged();
QList.setAdapter(mAdapter);
}
});
if (helper2 != null) {
helper2.close();
}
if (database2 != null) {
database2.close();
}
}
}
编辑:
Acutally onPostExecute
未执行原因。这就是我打电话的方式asynctask new CallXML(gcid, scid).execute();
答案 0 :(得分:2)
您没有在代码中向适配器提供字符串项。在将适配器设置为列表时,不需要调用notifyDataSetChanged,因为在设置适配器时,它会自动将数据加载到列表中。也许你我尝试这样做:
protected void onPostExecute(String result) {
Log.e("TAG", "In postExecute");
Cursor cur3 = database2.query("Quote", qfield, null, null, null, null, null);
cur3.moveToFirst();
mAdapter = new CustomAdapter();
do {
mAdapter.add(cur3.getString(2));
} while (cur3.moveToNext());
if(cur3 != null){
cur3.close();
}
QList.post(new Runnable() {
public void run() {
//mAdapter.notifyDataSetChanged();
QList.setAdapter(mAdapter);
}
});
if (helper2 != null) {
helper2.close();
}
if (database2 != null) {
database2.close();
}
}
答案 1 :(得分:2)
此外,onPostExecute
位于主线程上,因此不应该在那里进行数据库查询。相反,在doInBackground
中获取数据并从那里返回最终集合。
onPostExecute
可用于UI更新并使用结果集合更新适配器。
编辑:发布可运行的
QList.post(new Runnable() {
public void run() {
//mAdapter.notifyDataSetChanged();
QList.setAdapter(mAdapter);
}
});
由于您处于主循环中,因此不需要。
答案 2 :(得分:0)
你有没有错误?如果是的话请发布。如果不是检查从数据库获得的数据大小,如果要刷新listview,只需调用listview.invalidateViews(),它将刷新列表视图并在列表视图中设置新数据。