繁体   English   中英

在列表视图中每次刷新时保持滚动位置

[英]keep Scroll position with every refresh in list view

我在我的应用程序中设置了一个计时器,我可以从Web服务获取一些信息,并生成一个列表视图来显示。 现在我的问题是,每次计时器运行时,滚动回到开头......

如何在列表视图中每次刷新时保持滚动位置?

我的部分代码:

runOnUiThread(new Runnable() {
    public void run() {
        /**
         * Updating parsed JSON data into ListView
        * */
        ListAdapter adapter = new SimpleAdapter(DashboardActivity.this, 
                                                all_chat, 
                                                R.layout.list_item, 
                                                new String[] { TAG_FULLNAME,
                                                               TAG_DATE, 
                                                               TAG_MESSAGE }, 
                                                new int[] { R.id.fullname,
                                                            R.id.date, 
                                                            R.id.message }
                                               );
        // updating listview
        setListAdapter(adapter);
    }
});

TNX。

不要调用setAdapter() 做这样的事情:

ListAdapter adapter; // declare as class level variable

runOnUiThread(new Runnable() {
    public void run() {
        /**
         * Updating parsed JSON data into ListView
         */
        if (adapter == null) {
            adapter = new SimpleAdapter(
                    DashboardActivity.this, all_chat, R.layout.list_item, new String[]{TAG_FULLNAME, TAG_DATE, TAG_MESSAGE},
                    new int[]{R.id.fullname, R.id.date, R.id.message});
            setListAdapter(adapter);
        } else {
            //update only dataset   
            allChat = latestetParedJson;
            ((SimpleAdapter) adapter).notifyDataSetChanged();
        }
        // updating listview
    }
});

您可以将以下属性添加到xml中的ListView

android:stackFromBottom="true"
android:transcriptMode="alwaysScroll" 

添加这些属性,您的ListView将始终在底部绘制,就像您希望它在聊天中一样。

或者如果你想将它保持在以前的位置,请将alwaysScroll替换为normal

in the android:transcriptMode attribute. 

干杯!!!

我有同样的问题,尝试了很多东西来阻止列表更改其滚动位置,包括:

android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"

而不是调用listView.setAdapter(); 在我找到这个答案之前,它都没有奏效:

看起来像这样:

// save index and top position
int index = mList.getFirstVisiblePosition();
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : (v.getTop() - mList.getPaddingTop());

// ...

// restore index and position
mList.setSelectionFromTop(index, top);

说明:

ListView.getFirstVisiblePosition()返回顶部可见列表项。 但是此项可能会部分滚动到视图之外,如果要恢复列表的确切滚动位置,则需要获取此偏移量。 因此ListView.getChildAt(0)返回顶部列表项的View ,然后View.getTop() - mList.getPaddingTop()返回其从ListView顶部的相对偏移量。 然后,为了恢复ListView的滚动位置,我们使用我们想要的项目的索引调用ListView.setSelectionFromTop() ,并使用偏移量将其顶边定位在ListView的顶部。

Chris Banes写一篇很好的文章 对于第一部分,只需使用ListView#setSelectionFromTop(int)ListView保持在相同的可见位置。 为了防止ListView闪烁,解决方案是简单地阻止ListView布置它的子节点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM