Android ListView setSelectionFromTop无效

时间:2013-08-18 20:42:27

标签: android listview

我创建了一个动态ListView,其中从顶部添加了对象。

当用户按下按钮时,listView将从数组内容中更新,然后在自定义arrayAdapter上调用notifyDataSetChanged()。

现在我想在添加时保留列表位置,所以我添加了这段代码:

        // pausedCounter trace the number of objects(lines) to add to the listView
        int idx = listView.getFirstVisiblePosition() + pausedCounter;
        View first = listView.getChildAt(0);
        int position = 0;

        if (first != null)
            position = first.getTop();

        // cycle to add the new objects to the listView
        for (Tweet[] tweets1 : pausedTweets)
            super.updateTweets(tweets1);


        listView.setSelectionFromTop(idx, position);

        // reset of counter and accumulator
        pausedTweets = new ArrayList<Tweet[]>();
        pausedCounter = 0;

此代码的行为方式如下:如果getFirstVisiblePosition返回2,而pausedCounter为5,则更新后列表将设置为新五个元素的第3个。

我想要的是将列表的第一个可见元素设置为第8个。

经过进一步测试后,我发现listView的子节点数在这段代码运行期间没有变化,所以它更新了listView 的大小我调用了 setSelectionFromTop 。这可能是问题吗?

1 个答案:

答案 0 :(得分:21)

诀窍是:

        listView.post(new Runnable() {
            @Override
            public void run() {
                listView.setSelectionFromTop(idx, finalPosition);
            }
        });

使用 post 方法允许在更改位置之前等待ListView的更新。