notifyDataSetChanged() на моем адаптере не обновляет listview, почему?

#android #listview #listactivity #notify #baseadapter

#Android #listview #listactivity #уведомлять #baseadapter

Вопрос:

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

теперь в моем 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, все это работает.

Комментарии:

1. Было бы лучше, если бы вы поместили код, который показывает, как вы используете notifyDataSetChanged() для обновления списка.

Ответ №1:

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

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

 BuildingAdapter adapter = new BuildingAdapter(context);

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

Ответ №2:

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

Ответ №3:

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