Есть ли способ предотвратить пересканирование списка в верхнее положение при изменении данных адаптера?

У меня возникли проблемы с сохранением позиции прокрутки списка при изменении данных адаптера.

То, что я сейчас делаю, – создать пользовательский ArrayAdapter (с переопределенным методом getView) в onCreate ListFragment, а затем назначить его в свой список:

 mListAdapter = new CustomListAdapter(getActivity()); mListAdapter.setNotifyOnChange(false); setListAdapter(mListAdapter); 

Затем, когда я получаю новые данные от загрузчика, который периодически извлекает все, я делаю это в своем onLoadFinished :

 mListAdapter.clear(); mListAdapter.addAll(data.items); mListAdapter.notifyDataSetChanged(); 

Проблема в том, что вызов clear() сбрасывает положение прокрутки списка. Удаление этого вызова сохраняет позицию, но, очевидно, оставляет старые элементы в списке.

Каков правильный способ сделать это?

Solutions Collecting From Web of "Есть ли способ предотвратить пересканирование списка в верхнее положение при изменении данных адаптера?"

Как вы указали сами, вызов «clear ()» приводит к тому, что позиция будет сброшена вверх.

Поворот с прокруткой и т. Д. – это немного взломать, чтобы заставить это работать.

Если ваши подклассы CustomListAdapter из ArrayAdapter, это может быть проблемой:

Вызов clear (), вызывает 'notifyDataSetChanged ()'. Вы можете предотвратить это:

 mListAdapter.setNotifyOnChange(false); // Prevents 'clear()' from clearing/resetting the listview mListAdapter.clear(); mListAdapter.addAll(data.items); // note that a call to notifyDataSetChanged() implicitly sets the setNotifyOnChange back to 'true'! // That's why the call 'setNotifyOnChange(false) should be called first every time (see call before 'clear()'). mListAdapter.notifyDataSetChanged(); 

Я сам не пробовал, но попробую 🙂

Проверьте: сохранить / сохранить / восстановить позицию прокрутки при возврате в ListView

Используйте это, чтобы сохранить позицию в ListView перед вызовом .clear (), .addAll () и. notifyDataSetChanged ().

 int index = mList.getFirstVisiblePosition(); View v = mList.getChildAt(0); int top = (v == null) ? 0 : v.getTop(); 

После обновления адаптера ListView элементы списка ListView будут изменены, а затем установите новую позицию:

 mList.setSelectionFromTop(index, top); 

В основном вы можете сохранить свою позицию и вернуться к ней, сохранить состояние ListView или все состояние приложения.

Другие полезные ссылки:

Сохранить позицию: как сохранить и восстановить позицию ListView в Android

Сохранить состояние: Android ListView y position

С Уважением,

Пожалуйста, дайте мне знать, если это поможет!

В своем адаптере Expandable / List Adapter поместите этот метод

 public void refresh(List<MyDataClass> dataList) { mDataList.clear(); mDataList.addAll(events); notifyDataSetChanged(); } 

И из вашей деятельности, где вы хотите обновить список, введите этот код

 if (mDataListView.getAdapter() == null) { MyDataAdapter myDataAdapter = new MyDataAdapter(mContext, dataList); mDataListView.setAdapter(myDataAdapter); } else { ((MyDataAdapter)mDataListView.getAdapter()).refresh(dataList); } 

В случае расширенного просмотра списка вы будете использовать mDataListView.getExpandableListAdapter () вместо mDataListView.getAdapter ()