zoukankan      html  css  js  c++  java
  • Android 记录和恢复ListView滚动的位置的三种方法

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

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

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

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

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

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

    1. listView.setOnScrollListener(new OnScrollListener() {   
    2.   
    3.     /**  
    4.      * 滚动状态改变时调用  
    5.      */  
    6.     @Override  
    7.     public void onScrollStateChanged(AbsListView view, int scrollState) {   
    8.         // 不滚动时保存当前滚动到的位置   
    9.         if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {   
    10.             position = statusListView.getFirstVisiblePosition();   
    11.         }   
    12.     }   
    13.   
    14.     /**  
    15.      * 滚动时调用  
    16.      */  
    17.     @Override  
    18.     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {   
    19.     }   
    20. });  
    在恢复位置时调用
    1. listView.setSelection(position);  
    由于此方式的缺陷加上可以使用listView.scrollTo(x, y)滚动到某个位置,如scrollView.scrollTo(0, 0)表示滚动到顶部这点想到第一种方式,从而实现精确无误的滚动位置恢复

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

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

    1. listDataAdapter.getDataList.addAll(newDataList());   
    2. listDataAdapter.notifyDataSetChanged();  
  • 相关阅读:
    LeetCode 42. Trapping Rain Water
    LeetCode 209. Minimum Size Subarray Sum
    LeetCode 50. Pow(x, n)
    LeetCode 80. Remove Duplicates from Sorted Array II
    Window10 激活
    Premiere 关键帧缩放
    AE 「酷酷的藤」特效字幕制作方法
    51Talk第一天 培训系列1
    Premiere 视频转场
    Premiere 暴徒生活Thug Life
  • 原文地址:https://www.cnblogs.com/jingmo0319/p/5742703.html
Copyright © 2011-2022 走看看