Android 記錄和恢復ListView滾動的位置的三種方法


本文主要介紹記錄和恢復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();  

出處:http://trinea.iteye.com/blog/1481474

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM