当用户滚动到底部时,我正在使用OnScrollListener动态地将项添加到ListView。在我将数据添加到适配器并调用notifyDataSetChanged后,ListView返回到顶部。理想情况下,我想保留ListView中的位置。关于我应该如何做的任何想法?
答案 0 :(得分:97)
这可能是你想要的吗?
// save index and top position
int index = mList.getFirstVisiblePosition();
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : v.getTop();
// notify dataset changed or re-assign adapter here
// restore the position of listview
mList.setSelectionFromTop(index, top);
编辑28/09/2017:
自2015年以来,API发生了很大变化。它类似,但现在它将是:
// save index and top position
int index = mList.FirstVisiblePosition; //This changed
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : v.Top; //this changed
// notify dataset changed or re-assign adapter here
// restore the position of listview
mList.setSelectionFromTop(index, top);
答案 1 :(得分:6)
情况:
当您将适配器设置为listview时,它会刷新其状态。因此,通常会自动向上滚动。
解决方案:
如果没有任何适配器,则将适配器分配给listview,否则只更新分配的适配器的数据集,而不是将其重新设置为列表视图。
详细教程将在以下链接中解释;
Android ListView: Maintain your scroll position when you refresh
祝你好运!
答案 2 :(得分:0)
我实现了postDelayed,我在刷新时闪烁。我搜索了一些,发现我做错了。基本上我不应该每次想要更改数据时都创建新的适配器。我最终以这种方式做到了它并且有效:
//goes into your adapter
public void repopulateData(String[] objects) {
this.objects = null;
this.objects = objects;
notifyDataSetChanged();
}
//goes into your activity or list
if (adapter == null) {
adapter = new Adapter();
} else {
adapter.repopulateData((String[])data);
}
希望这有帮助。
答案 3 :(得分:0)
我正在使用
listView.getFirstVisiblePosition
保持最后的可见位置。
答案 4 :(得分:0)
使用listview的成绩单模式。
答案 5 :(得分:0)
试试这个
http://localhost:44300
答案 6 :(得分:0)
代码如下:
// Save the ListView state (= includes scroll position) as a Parceble
Parcelable state = listView.onSaveInstanceState();
// e.g. set new items
listView.setAdapter(adapter);
// Restore previous state (including selected item index and scroll position)
listView.onRestoreInstanceState(state);