Android ListView добавляет элементы в начало без просмотра списка прокрутки
У меня есть listView, и я хочу добавить новые элементы в начало списка, но я не хочу, чтобы просмотр списка просматривал его содержимое. Я хочу, чтобы пользователь просматривал тот же элемент, что и раньше, перед добавлением новых элементов.
Вот как я добавляю новые элементы в ListView:
this.commentsListViewAdapter.addRangeToTop(comments);
this.commentsListViewAdapter.notifyDataSetChanged();
и это метод addRangeToTop
:
public void addRangeToTop(ArrayList<Comment> comments)
{
for (Comment comment : comments)
{
this.insert(comment, 0);
}
}
это мой список:
<ListView
android:id="@+id/CommentsListView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@+id/AddCommentLayout"
android:stackFromBottom="true" >
</ListView>
Что я хочу сделать, это загрузить старые комментарии, когда пользователь прокручивается вверх.
Благодарим вас за помощь.
Ответы
Ответ 1
Я нашел решение здесь Сохранение позиции в ListView после вызова notifyDataSetChanged
Извините за повторяющийся вопрос.
Последний код:
int index = this.commentsListView.getFirstVisiblePosition() + comments.size();
View v = this.commentsListView.getChildAt(commentsListView.getHeaderViewsCount());
int top = (v == null) ? 0 : v.getTop();
this.commentsListViewAdapter.AddRangeToTop(comments);
this.commentsListViewAdapter.notifyDataSetChanged();
this.commentsListView.setSelectionFromTop(index, top);
Ответ 2
Возможно, именно это вы ищите:
android:transcriptMode="normal"
"Это делает список автоматически прокручиванием вниз, когда принимается уведомление об изменении набора данных, и только если последний элемент уже отображается на экране." - как указано здесь
Ответ 3
Также рассмотрите метод ListView public void setSelection (int position)
. После добавления новых комментариев и уведомления вашего адаптера вы можете использовать его для сохранения выбранного элемента.
// Get the current selected index
int previousSelectedIndex = yourListView.getSelectedItemPosition();
// Change your adapter
this.commentsListViewAdapter.AddRangeToTop(comments);
this.commentsListViewAdapter.notifyDataSetChanged();
// Determine how many elements you just inserted
int numberOfInsertedItems = comments.size();
// Update the selected position
yourListView.setSelection(previousSelectedIndex + numberOfInsertedItems);
ПРИМЕЧАНИЕ. Код не проверен. Удачи.