Android 更新listview时保持当前滚动位置
我想使用下面的代码获取新数据并将其更新到我的listView中, 我想要的是,当我滚动到listView的底部时,它会自动更新并向列表中添加新数据 例如:像facebook一样,只在底部添加新数据而不滚动,并保持当前位置 但我最终遇到了一些问题。 哪些是 1) listview已更新,但已回滚到顶部Android 更新listview时保持当前滚动位置,android,android-listview,android-adapter,onscrolllistener,Android,Android Listview,Android Adapter,Onscrolllistener,我想使用下面的代码获取新数据并将其更新到我的listView中, 我想要的是,当我滚动到listView的底部时,它会自动更新并向列表中添加新数据 例如:像facebook一样,只在底部添加新数据而不滚动,并保持当前位置 但我最终遇到了一些问题。 哪些是 1) listview已更新,但已回滚到顶部 listview .setOnScrollListener(new OnScrollListener() { private int currentVisibleItemCount;
listview .setOnScrollListener(new OnScrollListener() {
private int currentVisibleItemCount;
private int currentScrollState;
private int currentFirstVisibleItem;
private int totalItem;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
this.currentScrollState = scrollState;
this.isScrollCompleted();
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
this.currentFirstVisibleItem = firstVisibleItem;
this.currentVisibleItemCount = visibleItemCount;
this.totalItem = totalItemCount;
}
private void isScrollCompleted() {
if (totalItem - currentFirstVisibleItem == currentVisibleItemCount
&& this.currentScrollState == SCROLL_STATE_IDLE) {
Log.d("this is", "the end");
page = page + 1;
call_function(page);
}
}
});
....
....
public void call_function(int page_number) {
...
...
ListAdapter adapter = new SimpleAdapter(
getActivity(), user_List,
R.layout.user, new String[] {"user","date"},
new int[] {R.id.usr_name ,R.id.register_time});
// updating listview
setListAdapter(adapter);
}
是否有任何解决方案来处理此异常
提前感谢。有一个简单的解决方案。不要每次更新值时都添加新的ListAdapter,而是更新当前值。在适配器中弹出新数据后,调用
adapter.notifyDataSetChanged();
更新
适配器的数据时,可以保存列表当前选定项索引,并在呈现数据时将其设置回原位。大概是这样的:
int index = mList.getFirstVisiblePosition();
// do your update stuff
mList.smoothScrollToPosition(index);
您需要保留列表视图滚动位置,这里已经解释了解决方案我可以知道如何将以下适配器更改为支持notifydatachanged的适配器吗
ListAdapter adapter = new SimpleAdapter(
getActivity(), feeds_List,
R.layout.feed_item, new String[] {"username","datetime","pts",},
new int[] {R.id.usr_name ,R.id.feed_time,R.id.no_stamp});
setListAdapter(adapter);
提要列表是数据更新到的ArrayList
R.id.usr_name ,R.id.feed_time,R.id.no_stamp
是listview中的布局对象
所有代码都在listactivity中。最好使用int currentIndex=displaylist.getFirstVisiblePosition()以异步和预执行方式加载适配器,并保持当前位置代码>和在通知适配器调用后执行displaylist.smoothScrollToPosition(currentIndex)代码>
刷新后,您当前的查看位置将保持稳定 如果要使用notify datasetchanged(),适配器不能是simpleadapter,对吗?为什么不可以?SimpleAdapter扩展了存在notifyDataSetChanged方法的BaseAdapter有一个难题,您无法重新填充:/他们创建此方法时到底在想什么:////