Android ListView滚动到顶部
我有一个自定义行的ListView
。 当任何这些行被点击时,ListView的数据被重新生成。 我希望列表滚动到顶部发生这种情况。
我最初尝试在每行的OnClickListener
使用setSelection(0)
来实现这一目标,但不成功(我相信因为当数据无效时ListView
失去滚动位置 – 所以我对setSelection的调用被取消了。虽然ListView决定在无效后滚动到哪里)。
我所知道的唯一工作解决scheme是Romain Guy在这里提供的: http : //groups.google.com/group/android-developers/browse_thread/thread/127ca57414035301
它涉及( View.post
)对_listView.setSelection(0)
的调用。 我发现这performance相当差。 新生成的列表显示其滚动位置不变,并且在滚动返回顶部之前存在相当大的延迟。
有没有更好的方法来实现这个function?
任何帮助将非常感激。
谢谢!
调用listView.setSelectionAfterHeaderView();
滚动到顶部
我尝试了很多,但是这个为我工作
list.smoothScrollToPosition(0);
我只是使用listview.setSelection(0);
为我工作得很好。
就我个人而言,我build议你找一个不同的UI模式。 用户可能会发现你目前的“点击,列表更改原位 ”的方法直观,但我很怀疑。
您可以尝试inheritanceListView
并重写layoutChildren()
以链接到超类,然后在需要的情况下调用setSelection(0)
。 如果“相当大的延迟”是由于post()
调用所致,则应该将其清除。
如果您需要在ListView
适配器的数据更改后立即滚动,请注意它可能尚未填充。 在这种情况下,您应该通过Handler
post()
将setSelection()
或setSelectionAfterHeaderView()
post()
以便稍后在队列中调用它。
listView.Handler.post(new Runnable() { @Override public void run() { listView.setSelectionAfterHeaderView(); } });
这对我有效。
作为解决方法,您可以创build一个包含新重新生成的数据的新适配器,然后调用ListView.setAdapter。 之后调用ListView.setSelection(n)。
顺便说一句,由commonsware提供的解决scheme工作。
在一些不同的要求。 如果您想要像聊天时一样向上滚动。
mListView.smoothScrollToPosition(mAdapter.getCount());
- Android的本地图像caching解决scheme:Square Picasso vs Universal Image Loader
- 获取java.net.SocketTimeoutException:连接在android中超时
- GenyMotion无法启动Genymotion虚拟设备
- Android,canvas:如何清除(删除内容)一个canvas(=位图),生活在一个surfaceView?
- 有没有办法通过adb获取当前活动的布局和视图?
- 如何在Google Maps for Android API v2上显示我的位置
- 如何改变一个SwitchCompat的颜色
- 如何为Spinner的下拉菜单设置不同的主题?
- 如何在原生Android应用程序中使用“Font Awesome”中的图标和符号