歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android 記錄和恢復ListView滾動的位置的三種方法

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

日期:2017/3/1 10:24:42   编辑:Linux編程

本文主要介紹記錄和恢復listView滾動位置的3種方法,記錄listView滾動到的位置的坐標(推薦)、記錄listView顯示在屏幕上的第一個item的位置、通知適配器數據改變。

有時在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相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved