web-dev-qa-db-ja.com

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>

私がやりたいのは、ユーザーが一番上にスクロールしたときに古いコメントを読み込むことです。

ご協力ありがとうございました。

23
Harlsten

私はここで解決策を見つけました 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);
29
Harlsten

これがあなたが探しているものかもしれません:

Android:transcriptMode="normal"

「これにより、データセットの変更通知を受信したときに、最後のアイテムがすでに画面に表示されている場合にのみ、リストが自動的に一番下までスクロールします。」 -引用通り ここ

9
Kamran Ahmed

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);

注:コードはテストされていません。幸運を

2
Entreco