淘先锋技术网

首页 1 2 3 4 5 6 7

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