Android ListView将项目添加到顶部而没有列表视图滚动

时间:2013-03-24 10:41:11

标签: android listview scroll

我有一个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>

我想要做的是在用户滚动到顶部时加载旧评论。

感谢您的帮助。

3 个答案:

答案 0 :(得分:30)

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

答案 1 :(得分:9)

可能这就是你要找的东西:

android:transcriptMode="normal"

&#34;这会使列表在收到数据集更改通知时自动滚动到底部,并且仅当最后一项已在屏幕上可见时才会滚动到底部。&#34; - 引用here

答案 2 :(得分:2)

另请参阅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);

注意:代码未经测试。祝你好运