我正在使用可扩展的列表视图并每隔5秒更新一次列表,我想用与用户之前的数据相同的滚动位置更新列表中的新数据。
我可以使用getLastVisiblePosition & onSaveInstanceState
来实现这一目标,但我注意到了一些奇怪的事情,
当用户离开第0组时,我用新数据填充列表,onSaveInstanceState不仅适用于第0个索引,而它与其他扩展组一起工作正常。然而,我正在使用getLastVisiblePosition为第0组索引做解决方法,但是当新数据更新后,它会在更新可扩展列表视图后通过滚动到达位置,滚动有点非常烦人,它应该直接位于最后一个可见位置。
所以我的问题是,为什么onSaveInstanceState不适用于扩展的第0组,或者如果我使用getLastVisiblePosition,如何扰乱恼人的滚动。
任何建议都会很好
答案 0 :(得分:2)
根据我的经验,getLastVisiblePosition总是不起作用,索引有时候很奇怪,而对于onSaveInstanceState,它只有在你离开活动然后回来时才有效。这不是你的情况,这就是onSaveInstanceState无效的原因。
我认为使用onScroll侦听器并获取最后一个或第一个可见索引位置的最佳选择。查看下面的例子
虽然要删除这些恼人的动画,但您应该使用setSelection
而不是像smootScrolling等。
private int scrollTo
list.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
scrollTo = firstVisibleItem;
}
});
然后在为listview设置适配器后,您应该使用
list.setSelection(scrollTo);
我希望它会对你有所帮助。