Просмотр списка Android notifyDataSetChanged() переходит вниз

каждый раз, когда я вызываю notifyDataSetChanged() на моем адаптере, список отображает последний элемент в массиве адаптера. Есть ли какой-либо возможный способ прокрутить список до верхней части экрана, поскольку метод setSelection(n) в постобработке заметен, потому что список переходит вниз, а затем вверх. К сожалению, это движение видно на экране.

Заранее спасибо.


person user2581391    schedule 07.09.2014    source источник


Ответы (2)


Когда вы вызываете notifyDataSetChanged(), вы говорите ListView обновить свое содержимое, и он фактически попытается не прокручивать, если это возможно. Он знает, к чему он в данный момент прокручивается, основываясь на позициях элементов и идентификаторах, полученных от адаптера. Ваша проблема может заключаться в том, что ваш адаптер выдает несовместимые идентификаторы из getItemId, которые сбивают с толку ListView, вызывая его ненужную прокрутку. Не могли бы вы немного подробнее объяснить, что делает ваш код в момент вызова notifyDataSetChanged()? Вы одновременно добавляете или удаляете элементы в адаптере?

person Jschools    schedule 07.09.2014
comment
в основном ive 2 массива. первый обновляется, и новые элементы добавляются вверх. Этот список затем клонируется и модифицируется, потому что некоторые элементы должны быть вставлены между ними. Затем этот обновленный список передается адаптеру, и вызывается уведомление. - person user2581391; 07.09.2014
comment
Да, если вы добавите элементы наверх, он попытается остаться там, где он был до их добавления, что, вероятно, находится внизу. Попробуйте вызвать notifyDataSetInvalidated() перед изменением данных или изменить getItemId в адаптере, чтобы всегда возвращать позицию и hasStableIds в значение true. - person Jschools; 07.09.2014
comment
Окэ обнаружил, что проблема была: .setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); заболоченный - person user2581391; 07.09.2014
comment
... ха-ха, да, это сработает - person Jschools; 07.09.2014

Я думаю, это то, что вам нужно:

lv.setSelection(0);
person Sagar Pilkhwal    schedule 07.09.2014
comment
чувак Smoothscroll так же заметен, как и setSelection. дело в том, чтобы получить мгновенный список без какого-либо движения вверх - person user2581391; 07.09.2014