本文主要介紹記錄和恢複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