2011-10-27 10 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

アダプタがすでに設定されている場合は、再度設定するとリストビューが更新されません。リストビューにアダプタがあるかどうかを確認してから、適切なメソッドを呼び出します。

リストビューを設定しているときに、アダプタの新しいインスタンスを作成するのは良い考えではないと思います。代わりに、オブジェクトを作成します。

BuildingAdapter adapter = new BuildingAdapter(context); 

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

これには、AsyncTaskの代わりにAsyncTaskLoaderを使用してみましたか? Loadersが正確に設計されたのは、この種のものです。ローダーはAPI-10まで利用できなかったにもかかわらず、API-4以降のアンドロイドSupport Pacakgeで簡単にアクセスできます。

0

UIを更新できるのはonProgressUpdate(...);です。 doInBackground(...)からpublishProgress(...)に電話してください。

関連する問題