2012-02-18 131 views
0

當異步任務完成時,如何更新listivew。以下是示例代碼,但listview未更新。asynctask完成後更新列表視圖

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

    } 
} 

編輯:

NOTE:事實上沒有執行onPostExecute why..This是我叫asynctask new CallXML(gcid, scid).execute();

回答

2

此外,onPostExecute是在主線程上,所以不應該在那裏做數據庫查詢。相反,獲取doInBackground中的數據並從那裏返回最終的集合。

onPostExecute可用於UI更新並使用結果集合更新適配器。

編輯:發佈可運行

QList.post(new Runnable() { 
       public void run() { 
        //mAdapter.notifyDataSetChanged(); 
        QList.setAdapter(mAdapter);  
       } 
      }); 

是不需要的,因爲你是在主循環。

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

    } 
0

你有什麼錯誤嗎?如果是的話請張貼。如果沒有檢查你從數據庫中獲得的數據的大小,如果你想刷新listview只是調用listview.invalidateViews()它將刷新列表視圖並在列表視圖中設置新的數據。

相關問題