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

我在这里找到了解决方案Retaining position in ListView after call 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);
于 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 回答