调用notifyDataSetChanged后,在ListView中保留位置

时间:2011-11-26 03:50:18

标签: android listview

当用户滚动到底部时,我正在使用OnScrollListener动态地将项添加到ListView。在我将数据添加到适配器并调用notifyDataSetChanged后,ListView返回到顶部。理想情况下,我想保留ListView中的位置。关于我应该如何做的任何想法?

7 个答案:

答案 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);