#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(...)
.