我有一个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>
我想要做的是在用户滚动到顶部时加载旧评论。
感谢您的帮助。
答案 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);
注意:代码未经测试。祝你好运