2014-01-26 51 views
0

我有一個AsyncTask在「doinbackground」,它更新變量「圖片」,後來在postexecute我更新所有,問題是我想更新適配器,當我更新可變的「照片」。我應該在哪裏聲明適配器,並調用notifyDataSetChanged?Android的 - Gridview更新適配器的背景

 protected void onPostExecute(String file_url) { 
       // dismiss the dialog after getting all products 

      // updating UI from Background Thread 
      runOnUiThread(new Runnable() { 
       public void run() { 
        /** 
        * Updating parsed JSON data into ListView 
        * */ 
        mAdapter = new Gridadapter(tab.this, pics); 

         gridView.setAdapter(mAdapter); 
       } 
      }); 

thx!

回答

0

您不需要在onPostExecute內部調用runOnUiThread(...)。該方法已在UI線程內調用。

可以在聲明視圖的其他組件時聲明適配器,並且應該始終使用相同的實例。 (不創建一個新的適配器每次有更新就做的時間!)

我想創建這樣一個適配器:

public class GridAdapter extends BaseAdapter{ 

private ArrayList<Items> mItemList; 

    public void updateItemList(ArrayList<Items> newItemList){ 
     this.mItemList = newItemList; 
     notifyDataSetChanged(); 
    } 

} 

則實例吧:

public void onCreate(Bundle savedInstance){ 
    // ...all the previous code 

    mGridView = (GridView) findViewById(R.id.gridview); 
    mGridAdapter = new GridAdapter(this); 
    mGridView.setAdapter(mGridAdapter); 

} 

,並調用更新從onPostExecute:

protected void onPostExecute(String file_url) { 
    mGridAdapter.updateItemList(pics); 

} 
+0

完成,最後我把doinbackground後,在每次改變圖片\t \t runOnUiThread(新的Runnable(){ \t \t \t \t公共無效的run(){ \t \t \t \t \t/** \t \t \t \t \t *更新解析JSON數據轉換成的ListView \t \t \t \t \t * */ \t \t \t \t \t mAdapter.notifyDataSetChange d(); \t \t \t \t} \t \t \t});謝謝! – Sk8eR

+0

它的工作..但你沒有寫一個非常優化的代碼。您應儘可能少地調用mAdapter.notifyDataSetChanged(),因爲它將刷新整個視圖。如果更新適配器並僅調用一次mAdapter.notifyDataSetChanged(),則該視圖將只更新一次,UI將更具響應性。 –

相關問題