9

我创建了一个动态 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,则更新后列表将设置为新五个元素中的第三个。

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

经过进一步测试,我发现在这段代码的运行过程中,listView 的子项数量没有改变,因此在我调用setSelectionFromTop它会更新 listView 的大小。可能是这个问题吗?

4

1 回答 1

22

诀窍是这样的:

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

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

于 2013-08-18T22:18:18.530 回答