android-调用notifyDataSetChanged之后在ListView中保留位置
当用户滚动到底部时,我正在使用OnScrollListener将项目动态添加到ListView。 在将数据添加到适配器并尽管调用了notifyDataSetChanged之后,ListView回到顶部。 理想情况下,我想保留在ListView中的位置。 关于我应该如何做的任何想法?
SeanPONeil asked 2020-08-11T23:08:24Z
7个解决方案
97 votes
这可能是您想要的吗?
// 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);
iCantSeeSharp answered 2020-08-11T23:08:38Z
6 votes
情况:
将适配器设置为列表视图时,它将刷新其状态。 因此,通常会自动向上滚动。
解决方案:
如果没有适配器,则将适配器分配给列表视图,否则仅更新分配的适配器的数据集,而不将其重新设置为列表视图。
以下链接解释了详细的教程;
Android ListView:刷新时保持滚动位置
祝好运!
Taner answered 2020-08-11T23:09:25Z
0 votes
我实现了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);
}
希望这可以帮助。
MegaChan answered 2020-08-11T23:09:49Z
0 votes
我在用
listView.getFirstVisiblePosition
保持最后的可见位置。
Ajay answered 2020-08-11T23:10:19Z
0 votes
使用listview的成绩单模式。
stdout answered 2020-08-11T23:10:39Z
0 votes
试试这个
boolean first=true;
protected void onPostExecute(Void result)
{
if (first == true) {
listview.setAdapter(customAdapter);
first=false;
}
else
customAdapter.notifyDataSetChanged();
}
Bees Knees answered 2020-08-11T23:10:59Z
0 votes
这是代码:
// 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);
Aditya Rawat answered 2020-08-11T23:11:18Z