更新后的Android ListView会转到顶部,然后到正确的位置

时间:2013-08-19 08:32:46

标签: android listview position

我正在使用带有自定义ArrayAdapter的ListView。 列表是一个无限的推文卷轴。 列表的更新将从顶部插入。 我想获得Twitter应用程序的效果。我不是在谈论“滚动更新”,而是在更新后保持位置。

我刚刚实现了一些以这种方式工作的代码。这是:

        // get the position of the first visible tweet.
        // pausedCounter traces the number of tweets in the waiting line
        final int idx = listView.getFirstVisiblePosition() + pausedCounter;
        View first = listView.getChildAt(0);
        int position = 0;


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

        // here I update the listView with the new elements
        for (Tweet[] tweets1 : pausedTweets)
            super.updateTweets(tweets1);


        final int finalPosition = position;

        // this code maintain the position
        listView.post(new Runnable() {
            @Override
            public void run() {
                listView.setSelectionFromTop(idx, finalPosition);
            }
        });

这段代码的问题是,listView会立即转到列表的第一个元素,然后启动 setSelectionFromTop 并转到正确的位置。

这种“闪烁”很烦人,我想将其删除。

1 个答案:

答案 0 :(得分:1)

我发现只有这个解决方案:

        // add the new elements to the current ArrayAdapter
        for (Tweet[] tweets1 : pausedTweets)
            super.updateTweets(tweets1);

        // create a NEW ArrayAdapter using the data of the current used ArrayAdapter
        // (this is a custom constructor, creates an ArrayAdapter using the data from the passed)
        TweetArrayAdapter newTweetArrayAdapter =
                new TweetArrayAdapter(context, R.layout.tweet_linearlayout, (TweetArrayAdapter)listView.getAdapter());

        // change the ArrayAdapter of the listView with the NEW ArrayAdapter
        listView.setAdapter(newTweetArrayAdapter);

        // set the position. Remember to add as offset the number of new elements inserted
        listView.setSelectionFromTop(idx, position);

通过这种方式,我根本没有“闪烁”!