问:我的ListView(StickyListHeadersListView)没有保存确切的滚动位置。我引用了这个:
返回到ListView时保持/保存/还原滚动位置
当用户点击列表中的项目时,在应用程序转换为活动之前,我使用SharedPreferences保存“索引”和“顶部”。当我按活动返回列表视图片段时,列表会从它离开时到第一个可见列表项的顶部,而不是确切位置(即,如果第一个可见项被中途切除) ,返回片段时应将其切除一半)。
换句话说,偏移量没有保存。就像我说的,它可以保存第一个可见位置,但是没有保存确切的滚动。
mAdapter = new PeopleAdapter (getActivity (), null );
mList = (StickyListHeadersListView )rootView 。findViewById (ř 。ID 。stickyList ); mList 。setAdapter (mAdapter ); mList 。setAreHeadersSticky (true ); mList 。setDividerHeight (0 ); mList 。setOnItemClickListener (新
AdapterView 。OnItemClickListener () {
@覆盖公共空隙onItemClick (适配器视图<?>父,查看视图,INT位置,长ID ){光标光标= mAdapter 。getCursor (); 如果(光标!=空&&光标。moveToPosition (位置)){ MainActivity 。setIndex (
mList 。getFirstVisiblePosition ());
查看v = mList 。getListChildAt (0 ); int top = (v == null )吗?0 :(v 。共达()- mList 。getPaddingTop ()); MainActivity 。setTop (top ); 意向意向=新意向(getActivity (),ContactDetailActivity 。
类);
startActivity (intent ); } });
游标加载完成后,我在打电话
公共 无效 onLoadFinished (加载器< Cursor > 加载器, 游标 数据) {
android 。实用程序。日志。我(TAG ,“光标加载(” +数据。getCount将()+ “行)” ); mList 。setSelectionFromTop (MainActivity 。getIndex (),MainActivity 。共达()); mAdapter 。changeCursor (
数据);
mAdapter 。notifyDataSetChanged (); }
答:可以使用savedInstanceState保存精确的滚动条,ListView但是,在许多情况下,滚动条会随活动一起被破坏,并且我们不能轻易持久化,savedInstanceState因为我们只能将其真正转换为Parcelable对象,而并非旨在持久化。即使在尝试从中获取savedInstanceState信息时,ListView我们也会遇到一些问题。null通常会归还给我们,因为Android文档指定发生在“没有有趣的事情可保存”的情况下。好吧,在这种情况下,滚动非常有趣!可悲的是,Android并不总是会给我们提供这一点,这带来了很多问题...
实际上,我对此进行了更多查找,并注意到Android文档说:“此状态应仅包含非持久性信息或以后无法重建的信息。例如,您永远不会在屏幕上存储当前位置,因为那样会将新视图实例放入其视图层次结构时再次进行计算。”,所以这不是可行的方法。
当然,我们仍然可以使用您正在使用的方法,但是,在所有设备上它都不是完全正确的。对于一般的应用程序,我建议您仅保留列表项的索引,然后从顶部开始重新启动用户。
我不相信除了可以从ListView自身获取详细信息以外,我们还可以使用其他任何方法来访问滚动位置。因此,我们只能使用给出的信息。
您可能会疯了,尝试将aListView放入ScrollView (或其他一些容器也可以),然后我们可以使用诸如getScrollY()和setScrollY()这样的方法,但这依赖于始终存在相同数量的列表项,并且所有列表项都保持不变一样的大小。