2013-07-02 77 views
1

我有兩個類,HomeActivity和CustomListAdapter.THe HomeActivity類擴展一個活動,然後更新一個listview.I填充數據到ListView使用CustomListAdapter類擴展BaseAsapter.Everything工作正常,但我想要在後臺任務中加載數據。當我這樣做時,會出現一個錯誤。 這是我對AyncTask類的onPostExecute的實現。從AsyncTask更新ListView

@Override 
    protected void onPostExecute(HomeActivity Params){ 
     progressDialog.dismiss(); 
     runOnUiThread(new Runnable(){ 
      public void run(){ 
       final ListView lv1 = (ListView) findViewById(R.id.listings); 
       lv1.setAdapter(new CustomListAdapter(this, shares)); 
      } 
     }); 

    } 

我得到一個錯誤,告訴我,我應該改變CustomListAdapter.But構造當我改變它,一切順心。 我曾經嘗試這樣做太失敗

final ListView lv1 = (ListView) findViewById(R.id.listings); 
     lv1.setAdapter(new CustomListAdapter(this, shares)); 

股是從Web服務數據的ArrayList。 這裏是在CustomListAdapter類

public CustomListAdapter(Context context, ArrayList listData) { 
    this.listData = listData; 
    layoutInflater = LayoutInflater.from(context); 
} 

怎麼能去了解它的構造?如何將高度讚賞。

+0

據我所知,你不需要在runOnUiThreas的runnable中運行你的UI代碼,因爲它已經在onPostExecute(onPostExecute在UI線程上運行) – Andy

回答

4

你必須改變:

@Override 
protected void onPostExecute(HomeActivity Params){ 
    progressDialog.dismiss(); 
    runOnUiThread(new Runnable(){ 
     public void run(){ 
      final ListView lv1 = (ListView) findViewById(R.id.listings); 
      lv1.setAdapter(new CustomListAdapter(YourActivity.this, shares)); 
     } 
    }); 

} 
+0

謝謝Shani,它已經工作了。 –

+0

@mungaihkamau:我們永遠歡迎你! –

+6

onPostExecute在UI線程上運行,因此您不需要這種方式的runOnUiThread()。 – Dallas187

0

您正在將您的AsyncTask上下文發送到您的Adapter,您應該將您的Listview託管的Activity上下文放到您的AsyncTask類中,然後使用該上下文構造您的Adapter。

編輯:看這是通過在UI線程默認運行的例子,onPostExecute,它並不需要定義一個runOnUiThread

public class SyncHandler extends AsyncTask<String, Void, ResponseType>{ 
private Activity activity; 
public SyncHandler (Activity activity) 
{ 
    this.activity = activity; 
} 

然後在您的通話活動傳遞活動的上下文到您的異步類:

new SyncHandler(this).execute(); 
+0

我該怎麼做? –

+0

@mungaihkamau什麼是'onPostExecute(HomeActivity Params)'需要更多信息。 HomeActivtiy是什麼? – Raghunandan

+0

@mungaih Kamau:請看編輯回答 –

1

請參見下面的代碼對我的作品

@Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 

     progressDilaog.dismiss(); 

     itemListAdapter = new ItemListBaseAdapter(
         IncidentListActivity.this, Util.arrIncidents); 
     gridView.setAdapter(itemListAdapter); 
    } 

還有一件事,你不需要runOnUiThreadonPostExecute方法。你可以直接改變你的列表視圖。