我创建了一个动态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 。这可能是问题吗?
答案 0 :(得分:21)
诀窍是:
listView.post(new Runnable() {
@Override
public void run() {
listView.setSelectionFromTop(idx, finalPosition);
}
});
使用 post 方法允许在更改位置之前等待ListView的更新。