23

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です:

<ListView
    android:id="@+id/CommentsListView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_above="@+id/AddCommentLayout" 
    android:stackFromBottom="true" >        
</ListView>

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

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

4

3 に答える 3

29

ここで解決策を見つけました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);
于 2013-03-24T11:26:08.183 に答える
9

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

android:transcriptMode="normal"

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

于 2015-01-26T12:02:02.517 に答える
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);

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

于 2013-03-24T10:51:21.610 に答える