1

我正在使用带有自定义 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并转到正确的位置。

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

4

1 回答 1

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);

这样我就完全没有“闪烁”了!

于 2013-08-19T10:16:11.557 回答