在项目中,ListView需要即时的从服务器刷新数据,但是当用户滑动ListView时,每次刷新都会回到顶部(本次刷新数据不是在数据的list中添加新的数据,如果是这样可以采用adapter.notifyDataSetChanged()方法,也是从ListView当前位置向下添加,不会回到顶部,本次刷新listview数据是重新设置的adapter),用户体验不太好,查了一下,有一种可以保持ListView的滑动状态的方法,这样每次刷新ListView数据时不用回到顶部了,首先声明一个Parcelable对象(注:RefreshListView为自定义ListView,此处用法与普通ListView相同)
Parcelable state;refreshListView=(RefreshListView)findViewById(R.id.hall_3_list);
refreshListView.setAdapter(adapter);
refreshListView.setOnScrollListener(mScrollListener);
//用于保存状态,第一次设置适配器也要保存一次,避免没有滑动时造成空指针
state=refreshListView.onSaveInstanceState();
下面是滑动监听器,方便在滑动时保持状态
public OnScrollListener mScrollListener = new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
state = refreshListView.onSaveInstanceState();
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_FLING:
break;
case OnScrollListener.SCROLL_STATE_IDLE:
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
break;
default:
break;
}
adapter.notifyDataSetChanged();
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
};当再次获取了数据刷新ListView时,重新设置Adapter
adapter=new Hall2Adapter(AuctionHallHome3.this, AllConstant.Get_getAuctionListByRoom_result);
refreshListView.setAdapter(adapter);
refreshListView.onRestoreInstanceState(state);
本文介绍了一种在Android中更新ListView数据时保持其当前滚动位置的方法。通过使用Parcelable对象保存ListView的状态,在数据更新并重新设置Adapter后,调用onRestoreInstanceState()恢复之前的位置,从而改善用户体验。

990

被折叠的 条评论
为什么被折叠?



