ListView的position的保持
2015-09-21 11:11
162 查看
/article/4898332.html
原文链接
需求场景:
一个ListView页面,滑动阅读到某一位置,然后退出页面,下次再进入页面的时候,想要直接滑动到上次阅读的位置。
方案1:
页面退出的时候,ListView.getFirstVisiblePosition()来获取当前可见的第一个Item的position并记录,下次再进入页面的时候通过ListView.setSelection(int position)把ListView直接滑动到记忆的position。
此方案记忆的ListView的位置不够精准,因为position指定的是ListView的Item的index,setSelection(int pos)只能把index为pos的item作为第一个可见的item来显示,所以item总是顶头显示的,不会显示滑出屏幕一半的item,所以ListView的位置只能定位到某个item的开始位置,并不精准。
方案1的升级:
在方案1的基础上,再记录FirstVisiblePosition item的top/bottom等位置参数,然后恢复的时候ListView再scrollTo一下。
此方案仍然不行,ListView的scrollTo没效果。
终极方案:
退出页面的时候:
Parcelable listState = listView.onSaveInstanceState();
记住listState对象;
再次进入页面的时候:
listView.onRestoreInstanceState(listState);
记忆的位置分毫不差。
要注意:listView的状态记忆后,还要保证其数据在两次进入页面时的一致性;
另:ListView的header会影响其状态对象,不过这个是小问题。
还有另外一个方案:1:退出的时候, 可以获取到list.getFirstVisiblePosition(), 再算出这个view的位置view.getLocationInWindow, 保存postion和位置.
2:恢复的时候, list.setSelectionFromTop来恢复.,可以试试是否可行
原文链接
需求场景:
一个ListView页面,滑动阅读到某一位置,然后退出页面,下次再进入页面的时候,想要直接滑动到上次阅读的位置。
方案1:
页面退出的时候,ListView.getFirstVisiblePosition()来获取当前可见的第一个Item的position并记录,下次再进入页面的时候通过ListView.setSelection(int position)把ListView直接滑动到记忆的position。
此方案记忆的ListView的位置不够精准,因为position指定的是ListView的Item的index,setSelection(int pos)只能把index为pos的item作为第一个可见的item来显示,所以item总是顶头显示的,不会显示滑出屏幕一半的item,所以ListView的位置只能定位到某个item的开始位置,并不精准。
方案1的升级:
在方案1的基础上,再记录FirstVisiblePosition item的top/bottom等位置参数,然后恢复的时候ListView再scrollTo一下。
此方案仍然不行,ListView的scrollTo没效果。
终极方案:
退出页面的时候:
Parcelable listState = listView.onSaveInstanceState();
记住listState对象;
再次进入页面的时候:
listView.onRestoreInstanceState(listState);
记忆的位置分毫不差。
要注意:listView的状态记忆后,还要保证其数据在两次进入页面时的一致性;
另:ListView的header会影响其状态对象,不过这个是小问题。
还有另外一个方案:1:退出的时候, 可以获取到list.getFirstVisiblePosition(), 再算出这个view的位置view.getLocationInWindow, 保存postion和位置.
2:恢复的时候, list.setSelectionFromTop来恢复.,可以试试是否可行
相关文章推荐
- Linux初学——管理文件与目录(下)
- OSI网络模型以及TCP/IP模型(协议族)
- 国内能用的NTP服务器及和标准源的偏差值
- 母牛的故事
- 消逝的图腾
- Opencv2.4.9源码分析——SURF
- 设计模式学习笔记-工厂方法模式
- 设计模式学习笔记-简单工厂模式
- 分类,协力,代理设计模式
- ASP.NET MVC 4json之JsonResult
- 一道经典的Java多线程编程题
- 牛客堂常见面试题精讲(一)1
- java SE复习笔记31
- 火云开发课堂 - 《Shader从入门到精通》系列 第四节:在Shader中使用纹理
- Swift--从今天开始学习Swift
- <二>Copy和mutableCopy——iOS开发的疑惑
- C#使用模版创建execl文件
- onTouchEvent 和 onInterceptTouchEvent 事件触摸
- 设计模式学习笔记-策略模式
- IMP-00013 目前只有 DBA 其他导入能力 DBA 导出的文件