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

  1. mlistview.setSelection(position)  :  将ListView的index为position的item置顶(当然,如果ListView的最后一个item已经在最下面了,就什么也不做)
  2. mlistview.scrollTo(x, y)                    :  将ListView移动到指定的X,Y坐标(此处为绝对坐标)
  3. mlistview.scrollBy(x, y)                    :  将ListView移动到指定的X,Y坐标(此处为相对坐标,相对于ListView现在的X,Y坐标)

此外mlistview.getScrollX()和mlistview.getScrollY()可以获取ListView当前的X,Y坐标。




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

 

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

 

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

复制代码
listView.setOnScrollListener(new OnScrollListener() {  
  
    /** 
     * 滚动状态改变时调用 
     */  
    @Override  
    public void onScrollStateChanged(AbsListView view, int scrollState) {  
        // 不滚动时保存当前滚动到的位置  
        if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {  
            if (currentMenuInfo != null) {  
                scrolledX = listView.getScrollX();  
                scrolledY = listView.getScrollY();  
            }  
        }  
    }  
  
    /** 
     * 滚动时调用 
     */  
    @Override  
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {  
    }  
});  
复制代码

在恢复位置时调用

listView.scrollTo(scrolledX, scrolledY);  

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

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

复制代码
listView.setOnScrollListener(new OnScrollListener() {  
  
    /** 
     * 滚动状态改变时调用 
     */  
    @Override  
    public void onScrollStateChanged(AbsListView view, int scrollState) {  
        // 不滚动时保存当前滚动到的位置  
        if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {  
            position = listView.getFirstVisiblePosition();  
        }  
    }  
  
    /** 
     * 滚动时调用 
     */  
    @Override  
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {  
    }  
});  
复制代码

在恢复位置时调用

listView.setSelection(position);  

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

 

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

这种适用于listView追加数据的情况,严格说不是恢复listView滚动的位置,只是保持滚动位置不错。但却最实用,只要listView的adapter不变就能恢复。

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




备注:
SCROLL_STATE_FLING,这个参数表示你手离开后ListView还在“飞”中,理解?
SCROLL_STATE_IDLE,这个参数表示ListView停下不动了
SCROLL_STATE_TOUCH_SCROLL,这个参数表示你手还在ListView上




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中,我们经常使用 ListView 来展示一些数据。当我们滑动 ListView 时,如果需要记录当前滚动位置,并在下次打开时恢复到上次滚动位置,该怎么做呢?下面是一种完美的实现方法。 首先,在 Activity 中定义一个变量来记录当前滚动位置: ```java private int mLastFirstVisibleItem = 0; ``` 然后,在 ListView 的监听器中获取当前的滚动位置: ```java listView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (view.getId() == listView.getId()) { final int currentFirstVisibleItem = listView.getFirstVisiblePosition(); if (currentFirstVisibleItem > mLastFirstVisibleItem) { // 向上滚动 } else if (currentFirstVisibleItem < mLastFirstVisibleItem) { // 向下滚动 } mLastFirstVisibleItem = currentFirstVisibleItem; } } }); ``` 接下来,在 Activity 的 onResume() 方法中获取上次滚动位置恢复: ```java @Override protected void onResume() { super.onResume(); // 恢复滚动位置 if (mLastFirstVisibleItem != 0) { listView.setSelectionFromTop(mLastFirstVisibleItem, 0); } } ``` 最后,在 Activity 的 onPause() 方法中保存当前滚动位置: ```java @Override protected void onPause() { super.onPause(); // 保存滚动位置 mLastFirstVisibleItem = listView.getFirstVisiblePosition(); } ``` 至此,ListView 滚动位置记录恢复就完成了。这种方法适用于一般的 ListView,如果你使用了自定义的 Adapter 或者 ViewHolder,需要根据实际情况做出相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值