本文主要介绍记录和恢复listView滚动位置的3种方法(1)记录listView滚动到的位置的坐标(推荐)(2)记录listView显示在屏幕上的第一个item的位置(3)通知适配器数据改变。

有时在view切换时,需要恢复listView之前滚动到的位置,鉴于网上已有资料说的都是第二种方法,而第二种方法本身在精确度上较差,自己找到了第一种方法分享下

1、记录listView滚动到的位置的坐标,然后利用listView.scrollTo精确的进行恢复

  1. listView.setOnScrollListener(new OnScrollListener() {
  2. /**
  3. * 滚动状态改变时调用
  4. */
  5. @Override
  6. public void onScrollStateChanged(AbsListView view, int scrollState) {
  7. // 不滚动时保存当前滚动到的位置
  8. if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
  9. if (currentMenuInfo != null) {
  10. scrolledX = statusListView.getScrollX();
  11. scrolledY = statusListView.getScrollY();
  12. }
  13. }
  14. }
  15. /**
  16. * 滚动时调用
  17. */
  18. @Override
  19. public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
  20. }
  21. });

在恢复位置时调用

  1. listView.scrollTo(scrolledX, scrolledY);

2、记录listView显示在屏幕上的第一个item的位置,然后利用listView.setSelection恢复

这是网上能找到的最普遍的一种方式,但是却无法准确恢复到原位置,只能定位到每个item的位置,推荐使用第1种

  1. listView.setOnScrollListener(new OnScrollListener() {
  2. /**
  3. * 滚动状态改变时调用
  4. */
  5. @Override
  6. public void onScrollStateChanged(AbsListView view, int scrollState) {
  7. // 不滚动时保存当前滚动到的位置
  8. if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
  9. position = statusListView.getFirstVisiblePosition();
  10. }
  11. }
  12. /**
  13. * 滚动时调用
  14. */
  15. @Override
  16. public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
  17. }
  18. });

在恢复位置时调用

  1. listView.setSelection(position);

由于此方式的缺陷加上可以使用listView.scrollTo(x, y)滚动到某个位置,如scrollView.scrollTo(0, 0)表示滚动到顶部这点想到第一种方式,从而实现精确无误的滚动位置恢复

3、通知listView的适配器数据变更

这种适用于listView追加数据的情况,严格说不是恢复listView滚动的位置,只是保持滚动位置不错

  1. listDataAdapter.getDataList.addAll(newDataList());
  2. listDataAdapter.notifyDataSetChanged();

Android 记录和恢复ListView滚动的位置的三种方法的更多相关文章

  1. 【Android】Eclipse自己主动编译NDK/JNI的三种方法

    [Android]Eclipse自己主动编译NDK/JNI的三种方法 SkySeraph Sep. 18th  2014 Email:skyseraph00@163.com 一.Eclipse关联cy ...

  2. android系统通过图片绝对路径获取URI的三种方法

    最近做项目要通过图片的绝对路径找到图片的URI,然后删除图片,小小总结一下获取URI的方法,亲自试验在 android 4.1.3的系统上都是可用的. 1.将所有的图片路径取出,遍历比较找到需要的路径 ...

  3. JavaScript获取鼠标位置的三种方法

    在一些DOM操作中我们经常会跟元素的位置打交道,鼠标交互式一个经常用到的方面,令人失望的是不同的游览器下会有不同的结果甚至是有的游览器下没结果,这篇文章就鼠标点击位置坐标获取做一些简单的总结. 获取鼠 ...

  4. [聊天框]让DIV的滚动条自动滚动到最底部 - 4种方法

    要制作一个在线聊天的程序,在做最后的修饰时,需要对获得的信息即时滚动以保证用户总能看到最新消息. 聊天程序是基于AJAX设计的,没有用框架,消息容器是一个DIV,所以问题就在于如何控制DIV的滚动条. ...

  5. Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!

    大网站都有推出自己的手机访问版本页面,不管是新闻类还是视频网站,我们在电脑是无法直接访问到手机网站的,比如我经常访问一个3g.qq.com这个手机站点,如果在电脑上直接打开它,则会跳转到其它页面,一般 ...

  6. 让DIV的滚动条自动滚动到最底部 - 4种方法

    方法一:使用锚标记要滚动到的位置,然后通过click方法模拟点击滚动到锚所在位置 <script language="javascript1.2" type="te ...

  7. [Android] Android 异步定时任务实现的三种方法(以SeekBar的进度自动实现为例)

    [Android] Android 定时异步任务实现的三种方法(以SeekBar的进度自动实现为例) 一.采用Handler与线程的sleep(long)方法 二.采用Handler与timer及Ti ...

  8. 用Fiddler可以设置浏览器的UA 和 手动 --Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!

    附加以一种软件的方法是:用Fiddler可以设置浏览器的UA 以下3种方法是手动的 通过伪装User-Agent,将浏览器模拟成Android设备. 第一种方法:新建Chrome快捷方式 右击桌面上的 ...

  9. Android 改变字体颜色的三种方法

    在TextView中添加文本时有时需要改变一些文本字体的颜色,今天学到了三种方法,拿出来分享一下     1.在layout文件下的配置xml文件中直接设置字体颜色,通过添加android:textc ...

随机推荐

  1. OpenCV2.3.1在Win7+VS2010下的配置过程(转)

    转自:http://blog.csdn.net/mygis2005/article/details/10472717 这篇博客很好的解决了我遇到的问题,所以转到自己的博客里,方便以后进行查阅. 1.  ...

  2. iOS开发 GET、POST请求方法(NSURLSession篇)

    NSURLConnection,在iOS9被宣布弃用,本文不使用NSURLConnection进行网络编程,有兴趣的童鞋可以参考: [iOS开发 GET.POST请求方法(NSURLConnectio ...

  3. linux pam 控制模式

    工作类别(type).流程栈(stack)和控制模式(control) Linux-PAM 工作的"类别"(type) PAM 的具体工作主要有以下四种类别(type):accou ...

  4. NK3C:异常处理(前端)

    前端的提示有些也不是很规范,主要体现如下: 1.ResultInfo的返回值,false的情况下,未做处理: 2.ResultInfo的返回值,false的情况下,做了其他操作,未提示错误:(虽然没报 ...

  5. 1o_Samba

    ∮Linux下Samba的安装配置 §Linux 下文件共享软件 Samba 是一款实现跨主机,跨平台文件共享的软件.同类型的软件还有 ftp,nfs 不再赘述. §文件共享协议 Windows : ...

  6. 移动端自动化环境搭建-wxpython的安装

    安装wxpython A.安装依赖 wxPython 是 Python 非常有名的一个 GUI 库,因为 RIDE 是基于这个库开发的,所以这个必须安装. B.安装过程 下载地址:http://www ...

  7. IP验证正则表达式

    Regex r = new Regex(@"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$" ...

  8. js关于页面坐标api

    网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见区域宽: document.body.offset ...

  9. wamp 配置遇到的问题

    /* 最近开发部署更换到国内的服务器,想来想去还是更换为wamp套件. 但是由于下的版本的都不太适合. 外网一直显示拒绝.排查问题之后 写个笔记做个记录 */ wamp You don't have ...

  10. PHP实现异步调用方法研究

    作者: Laruence 本文地址: http://www.laruence.com/2008/04/14/318.html 转载请注明出处 , ,); curl_setopt_array(, ); ...