我正在使用带有自定义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 并转到正确的位置。
这种“闪烁”很烦人,我想将其删除。
答案 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);
通过这种方式,我根本没有“闪烁”!