2011-10-27 53 views
1

我有一個擴展listactivity的活動,在這個類中擴展我有一個擴展baseadapter的類。我的適配器上的notifyDataSetChanged()不會更新列表視圖,爲什麼?

現在我listactivity我有這樣的onCreate

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setListAdapter(new BuildingAdapter(this)); 

    final ProgressDialog loading = new ProgressDialog(this); 
    loading.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    loading.setTitle("Laddar"); 
    loading.setMessage("Hämtar data från servern"); 
    loading.show(); 

    new AsyncTask<Void, Void, DataPacket.Data>() 
    { 
     @Override 
     protected DataPacket.Data doInBackground(Void... params){ 
      return ServerConnection.getBuildings(); 
     } 

     @Override 
     protected void onPostExecute(DataPacket.Data param) { 
      ((MainenanceApplication)getApplication()).setDataStructure(param); 
      loading.dismiss(); 
      //((BuildingAdapter)getListAdapter()).notifyDataSetChanged(); 
      setListAdapter(new BuildingAdapter(BuildingSelectionActivity.this)); 
     } 

    }.execute(); 
} 

這工作,因爲它是應該的,但我的問題是在onPostExecute我更新數據結構,列表適配器使用。 爲什麼不能直接調用notifyDataSetChanged?

如果我有那一行視圖不會自我更新,但如果我在setListAdapter所在的位置使用該行,它將全部工作。

+0

可能會更好,您將代碼顯示如何使用notifyDataSetChanged()更新列表。 –

回答

1

如果適配器已經設置,再次設置不會刷新列表視圖。首先檢查一下listview是否有適配器,然後調用適當的方法。

我認爲在設置列表視圖時創建適配器的新實例並不是一個好主意。相反,創建一個對象。

BuildingAdapter adapter = new BuildingAdapter(context); 

    if(getListView().getAdapter() == null){ //Adapter not set yet. 
    setListAdapter(adapter); 
    } 
    else{ //Already has an adapter 
    adapter.notifyDataSetChanged(); 
    } 
1

您是否嘗試過使用AsyncTaskLoader而非此AsyncTask。這正是Loaders正是爲此而設計的。請注意,即使裝載機在API-10之前不可用,您仍然可以通過API-4及以上的android Support Pacakge輕鬆訪問它們。

0

唯一可以更新UI的地方是onProgressUpdate(...);。從您的doInBackground(...),請致電publishProgress(...)

相關問題