listview在添加新数据后notifyDataSetInvalidated,默认显示是回到第一行,但是习惯的话是显示位置不变,保持在最后一行,在网上找了很多方法,基本都是说记住位置,在notify之后恢复位置,在实际操作以后,在http://stackoverflow.com/questions/3014089/maintain-save-restore-scroll-position-when-returning-to-a-listview里面找到了一个记住位置的方法,亲测有用,恢复位置也很精确。
// save index and top position
int index = mList.getFirstVisiblePosition();
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : (v.getTop() - mList.getPaddingTop());
// ...
// restore index and position
mList.setSelectionFromTop(index, top);
但是却存在一个问题,这个方法不是每一次都有效,有时他还是会回到第一行,具体原因研究了很久也没有找到,不知道有没有人解决过这个问题
这里是我的代码
listview.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == SCROLL_STATE_IDLE){
scrollPosition = lv.getFirstVisiblePosition();
}
if (null != list){
View v = lv.getChildAt(0);
scrollTop = (v==null)?0:(v.getTop()-lv.getPaddingTop());
}
if (null != list &&!list.isEmpty()&&!isrefrash&&isbottom){
//下载新数据方法
loadnews();
//是否正在刷新
isrefrash = true;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//根据现实条目判断是否到底部
if (firstVisibleItem + visibleItemCount == totalItemCount) {
isbottom = true;
}else {
isbottom = false;
}
}
});
其中也试过监听是否在滑动,设置在不滑动时才下载新数据,但是也没有用
我平常都用notifydatasetchanged,刷新后不改变当前位置