ListView с пользовательским адаптером прокручивается вниз при первом перезапуске загрузчика
Я столкнулся со странной проблемой здесь.
В моем приложении пользователь должен перезагрузить загрузчик после обновления некоторых настроек onLoadFinished
, все хорошо здесь, дело в том, что я поставил mAdapter.notifyDataSetChanged();
он прокручивается до самого конца списка.
Странная часть в том, что это происходит только один раз, при первом перезапуске загрузчика. Все остальное время вид остается именно там, где он есть.
Я уведомляю об изменении в потоке пользовательского интерфейса...
getLoaderManager().initLoader(EXISTING_EVAL_LOADER, null, ViewActivity.this);
runOnUiThread(new Runnable() {
public void run() {
mAdapter.notifyDataSetChanged();
}
});
Если я не позвоню notifyDataSetChanged();
приложение вылетает только при нажатии элемента списка, и я получаю:
java.lang.IllegalStateException: содержимое адаптера изменилось, но ListView не получил уведомление. Убедитесь, что содержимое вашего адаптера не изменено из фонового потока, а только из потока пользовательского интерфейса. Убедитесь, что ваш адаптер вызывает notifyDataSetChanged() при изменении его содержимого.
2 ответа
Я думаю, что ваш listView
является CHOICE_MODE_SINGLE
и последний элемент выбран в listView
и поэтому listView
прокручивает к выбору.
если вам не нужно выбирать элементы на listView
использовать этот:
listView.setChoiceMode(ListView.CHOICE_MODE_NONE)
или в xml: android:choiceMode="none"
в противном случае, если вам нужны ваши настройки выбора, используйте это после установки адаптера в listView
:
listView.clearChoices();
listView.setAdapter(listView.getAdapter());
Если вы хотите, чтобы первый элемент был выбран и прокручивался до самого верха, вы можете использовать следующий код:
listView.setSelectionAfterHeaderView();
или же
listView.setSelection(0);
Я бы предложил
if (cursor.getCount() > 0) {
cursor.moveToPosition(-1);
while (cursor.moveToNext()) {
<do stuff>
}
}
cursor.close();