9

我在我的应用程序中设置了一个计时器,我可以从 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。

4

4 回答 4

14

不要打电话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
    }
});
于 2013-10-09T12:14:47.177 回答
6

您可以将以下属性添加到您的ListViewin xml。

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

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

或者,如果您想将其保留在以前的位置,请替换alwaysScrollnormal

in the android:transcriptMode attribute. 

干杯!!!

于 2013-06-05T22:05:00.250 回答
2

我遇到了同样的问题,尝试了很多方法来防止列表改变其滚动位置,包括:

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()返回顶部可见列表项。但是这个item可能会被部分滚动出视图,如果你想恢复列表的确切滚动位置你需要得到这个偏移量。所以ListView.getChildAt(0)返回View顶部列表项的 ,然后View.getTop() - mList.getPaddingTop()返回它与顶部的相对偏移量ListView。然后,为了恢复ListView的滚动位置,我们调用ListView.setSelectionFromTop()我们想要的项目的索引和一个偏移量来定位它的顶部边缘从ListView.

于 2016-09-30T13:44:13.530 回答
1

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

于 2013-10-04T16:24:26.760 回答