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 = statusListView.getScrollX();
- scrolledY = statusListView.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 = statusListView.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滾動的位置,只是保持滾動位置不錯
- listDataAdapter.getDataList.addAll(newDataList());
- listDataAdapter.notifyDataSetChanged();