Подтвердить что ты не робот

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>

Что я хочу сделать, это загрузить старые комментарии, когда пользователь прокручивается вверх.

Благодарим вас за помощь.

4b9b3361

Ответ 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);

ПРИМЕЧАНИЕ. Код не проверен. Удачи.