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

当用户滚动到底部时,我使用OnScrollListenerdynamic地将项目添加到ListView。 在将数据添加到适配器并调用notifyDataSetChanged之后,ListView又回到顶部。 理想情况下,我想保留在ListView中的位置。 任何想法,我应该怎么做呢?

这可能是你想要的吗?

// 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); 

情况:

当你将一个适配器设置到你的列表视图中时,刷新它的状态。 所以, 通常会自动滚动。

解决scheme:

指定一个适配器到listview,如果它没有,否则只更新分配的适配器的数据集,而不是重新设置到你的列表视图。

下面的链接解释了详细的教程。

Android ListView:刷新时保持滚动位置

祝你好运!

我实现了postDelayed,刷新时闪烁。 我search了一些,发现我做错了事。 基本上我不应该创build一个新的适配器,每次我想改变数据。 我结束了这样做,它的工作原理:

 //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); } 

希望这可以帮助。

我在用

listView.getFirstVisiblePosition

保持最后的可见位置。

去与listview的抄本模式。

尝试这个

  boolean first=true; protected void onPostExecute(Void result) { if (first == true) { listview.setAdapter(customAdapter); first=false; } else customAdapter.notifyDataSetChanged(); }