1

このクラスで拡張されたlistactivityを拡張するアクティビティがあります。baseadapterを拡張するクラスがあります。

今私のリストアクティビティに私はこれを持っています 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 を実行する行を使用すると、すべて機能します。

4

3 に答える 3

1

このために AsyncTaskの代わりにAsyncTaskLoaderを使用してみましたか。ローダーがまさにそのために設計されたのは、この種のものです。ローダーは API-10 まで利用できませんでしたが、API-4以降の Androidサポート パッケージを介して簡単にアクセスできます。

于 2011-10-27T17:13:11.613 に答える
1

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

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

BuildingAdapter adapter = new BuildingAdapter(context);

    if(getListView().getAdapter() == null){ //Adapter not set yet.
     setListAdapter(adapter);
    }
    else{ //Already has an adapter
    adapter.notifyDataSetChanged();
    }
于 2011-10-27T18:01:28.457 に答える
0

UIを更新できるのは。だけですonProgressUpdate(...);。あなたからdoInBackground(...)、を呼び出しますpublishProgress(...)

于 2011-10-27T17:18:08.103 に答える