更新列表视图

时间:2015-04-29 08:18:52

标签: android android-listview android-adapter onscrolllistener

我想获取新数据并使用下面的代码将其更新到我的listView中, 我想要的是当我滚动到listView的底部时,它会自动更新并将新数据添加到列表中。

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

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

1)列表视图已更新,但它会滚动回到顶部。

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);
}

处理此异常的任何解决方案??

提前感谢。

5 个答案:

答案 0 :(得分:4)

更新Adapter数据时,您可以保存列表当前所选项目索引,并在呈现数据时将其设置回来。像这样:

int index = mList.getFirstVisiblePosition();
// do your update stuff
mList.smoothScrollToPosition(index);

答案 1 :(得分:1)

有一个简单的解决方案。每次更新值时都不要添加新的ListAdapter,而是更新当前值。在适配器中添加新数据后,请调用

adapter.notifyDataSetChanged();

答案 2 :(得分:1)

最好在异步中加载适配器并在执行前使用int currentIndex=displaylist.getFirstVisiblePosition();保持当前位置,并在通知适配器调用displaylist.smoothScrollToPosition(currentIndex);后在postExecute中 刷新后,您当前的查看位置将保持稳定。

答案 3 :(得分:0)

您需要保留列表视图滚动位置,此处已解释此解决方案Reataining listview scroll position

答案 4 :(得分:0)

我是否知道如何将以下适配器更改为支持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);

feed_list是数据更新为的ArrayList<HashMap<String, String>>

R.id.usr_name ,R.id.feed_time,R.id.no_stamp

是列表视图中的布局对象。

所有代码都在listactivity中。