Android 记录和恢复ListView滚动的位置的三种方法

时间:2022-09-22 08:01:47

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

有时在view切换时,需要恢复listView之前滚动到的位置,鉴于网上已有资料说的都是第二种方法,而第二种方法本身在精确度上较差,自己找到了第一种方法分享下Android 记录和恢复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. &lbrack;Android&rsqb; Android 异步定时任务实现的三种方法&lpar;以SeekBar的进度自动实现为例&rpar;

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

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

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

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

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

随机推荐

  1. TSQL 分组集(Grouping Sets)

    分组集(Grouping Sets)是多个分组的并集,用于在一个查询中,按照不同的分组列对集合进行聚合运算,等价于对单个分组使用“union all”,计算多个结果集的并集.使用分组集的聚合查询,返回 ...

  2. Ubuntu下编译安装OpenCV 2&period;4&period;7并读取摄像头&lbrack;转&rsqb;

    主要参考: 1.http://www.ozbotz.org/opencv-installation/ 2.http://www.ozbotz.org/opencv-install-troublesho ...

  3. Unity3d 解析文本执行已注册的自定函数

    最近有个需求是想让程序解析策划编辑一个文本生成一段CG,内容使用大致是这样 cgSetCameraEx(118.6324,30.71189,75.55666,45,-45,0,0) cgCloneMy ...

  4. WebApp MVC 框架的开发细节归纳

    在前文<WebApp MVC,“不一样”的轻量级互联网应用程序开发框架>介绍了WebApp MVC的技术实现以及如何使用,而在本章进一步归纳了使用框架开发的一些细节,也给我们在开发具体功能 ...

  5. PHP学习笔记:MySQL数据库的操纵

    Update语句 Update 表名 set 字段1=值1, 字段2=值2  where  条件 练习: 把用户名带  ‘小’的人的密码设置为123456@ 语句:UPDATE crm_user SE ...

  6. 查看sqlserver版本及其补丁

    select @@version select serverproperty('productlevel')

  7. File transfer in android with asmack and Openfire

    http://harryjoy.com/2012/08/18/file-transfer-in-android-with-asmack-and-openfire/ http://www.javacod ...

  8. spring和springMVC的上下文

    上下文可以替代注解, 但是注解更方便 package com.tgb.web.controller; import javax.annotation.Resource; import javax.se ...

  9. mysql innodb 唯一键里的字段为什么不能为NULL

    mysql 唯一键失效 CREATE TABLE `studnet_unique` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100 ...

  10. lnmp环境 swoole聊天室

    pecl install swoole 安装php扩展swooleservice php-fpm restart 重启php服务whereis php.ini 查看php.ini的位置 查看文件是否配 ...