调用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(); }