asynctask完成后更新列表视图

时间:2012-02-18 10:21:01

标签: android listview android-asynctask

如何在完成异步任务时更新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();

3 个答案:

答案 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(),它将刷新列表视图并在列表视图中设置新数据。