Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 更新listview时保持当前滚动位置_Android_Android Listview_Android Adapter_Onscrolllistener - Fatal编程技术网

Android 更新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中, 我想要的是,当我滚动到listView的底部时,它会自动更新并向列表中添加新数据

例如:像facebook一样,只在底部添加新数据而不滚动,并保持当前位置

但我最终遇到了一些问题。 哪些是

1) listview已更新,但已回滚到顶部

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有一个难题,您无法重新填充:/他们创建此方法时到底在想什么:////