Android 记录和恢复ListView滚动的位置的两种方法

时间:2021-07-29 18:41:08

来源:
http://trinea.iteye.com/blog/1481474
http://www.cnblogs.com/gzggyy/archive/2012/05/31/2528552.html


本文主要介绍记录和恢复listView滚动位置的2种方法,记录listView显示在屏幕上的第一个item的位置、通知适配器数据改变。


1、记录listView显示在屏幕上的第一个item的位置,然后利用listView.setSelection恢复

抱歉此方法无法准确恢复到原位置,只能定位到每个item的位置

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

2、通知listView的适配器数据变更

这种适用于listView追加数据的情况,严格说不是恢复listView滚动的位置,只是保持滚动位置不错。但却最实用,只要listView的adapter不变就能恢复。

listDataAdapter.getDataList.addAll(newDataList()); 
listDataAdapter.notifyDataSetChanged();

网上还流传一种方式,这种方式很坑

记录listView滚动到的位置的坐标,然后利用listView.scrollTo精确的进行恢复
等实际运行发现, scrollY 死活就是0

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

end