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

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

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

 

有時在view切換時,須要恢復listView以前滾動到的位置,鑑於網上已有資料說的都是第二種方法,而第二種方法自己在精確度上較差,本身找到了第一種方法分享下java

 

一、記錄listView滾動到的位置的座標,而後利用listView.scrollTo精確的進行恢復ide

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) {
	}
});

 在恢復位置時調用spa

listView.scrollTo(scrolledX, scrolledY);

 

二、記錄listView顯示在屏幕上的第一個item的位置,而後利用listView.setSelection恢復code

這是網上能找到的最廣泛的一種方式,可是卻沒法準確恢復到原位置,只能定位到每一個item的位置,推薦使用第1種htm

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) {
	}
});

在恢復位置時調用blog

listView.setSelection(position);

因爲此方式的缺陷加上能夠使用listView.scrollTo(x, y)滾動到某個位置,如scrollView.scrollTo(0, 0)表示滾動到頂部這點想到第一種方式,從而實現精確無誤的滾動位置恢復get

 

三、通知listView的適配器數據變動it

這種適用於listView追加數據的狀況,嚴格說不是恢復listView滾動的位置,只是保持滾動位置不錯io

listDataAdapter.getDataList.addAll(newDataList());
listDataAdapter.notifyDataSetChanged();
相關文章
相關標籤/搜索