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>
私がやりたいのは、ユーザーが一番上にスクロールしたときに古いコメントを読み込むことです。
ご協力ありがとうございました。
私はここで解決策を見つけました notifyDataSetChangedを呼び出した後のListViewでの位置の保持
質問が重複して申し訳ありません。最終的なコードはこれです:
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);
これがあなたが探しているものかもしれません:
Android:transcriptMode="normal"
「これにより、データセットの変更通知を受信したときに、最後のアイテムがすでに画面に表示されている場合にのみ、リストが自動的に一番下までスクロールします。」 -引用通り ここ
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);
注:コードはテストされていません。幸運を