7

场景如下:我有一个简单的 ListView 显示 twitter 提要。我有一个从 sqlite 获取推文的 CursorAdapter。当我在光标上调用 requery() 时,我希望将获取已添加到数据库中的新推文。这一切都很好,发生这种情况后,新项目甚至在 ListView 中可见。

问题是滚动位置似乎是根据项目位置偏移量保存的。因此,假设我的 ListView 中的第一个可见位置是 4。当我重新查询并将 2 个新项目添加到列表顶部时,ListView 将第一个可见项目滚动位置保持为 4,但是由于列表中有两个新项目,我现在在位置 4 看到了与刷新之前不同的项目。此图说明了之前和之后: 在此处输入图像描述

注意之前,Tweet D是第一个可见项目,之后,Tweet B现在成为第一个可见项目。

我的问题是,如何在调用重新查询时根据光标位置保持相同的滚动位置,以便在此示例中,Tweet D仍然是重新查询后的第一个可见项目?

4

2 回答 2

3

我在我的一个项目中遇到了类似的问题。这是我解决它的方法。虽然情况并不完全相同。希望能帮助到你。

在更新列表之前,请以这种方式保存滚动位置 -

int position = getListView().getFirstVisiblePosition();
View v = getListView().getChildAt(0);
int top = v == null ? 0 : v.getTop();

然后在更新列表后,您将知道添加了多少项目。所以你可以打电话

yourlistview.setSelectionFromTop(position + <number of items added>, top);
于 2013-01-10T13:46:21.707 回答
0

我的建议是跟踪列表中的项目数量。一旦您知道这一点,作为更新的一部分,您可以添加旧计数和新计数之间的差异。

伪代码

on_update

  offset+= (list_view.length() - list_size)
  list_size = list_view.length()
于 2013-01-10T13:32:12.873 回答