notifyDataSetChanged () на моем адаптере не обновляет представление списка, почему? - PullRequest
1 голос
/ 27 октября 2011

У меня есть действие, которое расширяет списки, расширенные в этом классе, у меня есть класс, который расширяет baseadapter.

Теперь в моей заявке у меня есть это наСоздать

 /** 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, все это работает.

Ответы [ 3 ]

1 голос
/ 27 октября 2011

Если адаптер уже установлен, его повторная установка не обновит представление списка.Вместо этого сначала проверьте, есть ли у списка представления адаптер, а затем вызовите соответствующий метод.

Я думаю, что не очень хорошая идея создавать новый экземпляр адаптера при настройке представления списка.Вместо этого создайте объект.

BuildingAdapter adapter = new BuildingAdapter(context);

    if(getListView().getAdapter() == null){ //Adapter not set yet.
     setListAdapter(adapter);
    }
    else{ //Already has an adapter
    adapter.notifyDataSetChanged();
    }
1 голос
/ 27 октября 2011

Вы пытались использовать AsyncTaskLoader вместо AsyncTask для этого. Именно для этого типа Loaders были специально разработаны. Обратите внимание, что хотя загрузчики не были доступны до API-10, вы все равно можете легко получить к ним доступ через Android Support Pacakge от API-4 и выше.

0 голосов
/ 27 октября 2011

Единственное место, где вы можете обновить пользовательский интерфейс - onProgressUpdate(...);. С вашего doInBackground(...) звоните publishProgress(...).

...