ListView с пользовательским адаптером прокручивается вниз при первом перезапуске загрузчика - PullRequest
0 голосов
/ 07 мая 2018

У меня тут странная проблема.

В моем приложении пользователь должен перезапустить загрузчик после обновления некоторых настроек 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 ]

0 голосов
/ 07 мая 2018

Я полагаю, что ваш 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);
0 голосов
/ 07 мая 2018

Я бы предложил

if (cursor.getCount() > 0) {
    cursor.moveToPosition(-1);
    while (cursor.moveToNext()) {
          <do stuff>
    }
}

cursor.close();
...