添加新项目时调用Requery后,带有CursorAdapter的Android ListView的滚动位置不正确

添加新项目时调用Requery后,带有CursorAdapter的Android ListView的滚动位置不正确,android,android-listview,xamarin.android,android-cursoradapter,Android,Android Listview,Xamarin.android,Android Cursoradapter,下面是一个场景:我有一个简单的列表视图显示一个twitter提要。我有一个CursorAdapter从sqlite获取推文。当我在光标上调用requery()时,我希望会获取新的tweet,这些tweet后来被添加到数据库中。这一切都很好,在这之后,新项目甚至可以在ListView中看到 问题是滚动位置似乎是基于项目位置偏移保存的。假设ListView中的第一个可见位置是4。当我重新查询并将两个新项目添加到列表顶部时,ListView会将第一个可见项目滚动位置保持为4,但是由于列表中有两个新项目

下面是一个场景:我有一个简单的列表视图显示一个twitter提要。我有一个CursorAdapter从sqlite获取推文。当我在光标上调用requery()时,我希望会获取新的tweet,这些tweet后来被添加到数据库中。这一切都很好,在这之后,新项目甚至可以在ListView中看到

问题是滚动位置似乎是基于项目位置偏移保存的。假设ListView中的第一个可见位置是4。当我重新查询并将两个新项目添加到列表顶部时,ListView会将第一个可见项目滚动位置保持为4,但是由于列表中有两个新项目,因此我现在在位置4处看到的项目与刷新前不同。此图显示了以下操作之前和之后的情况:

请注意,之前,Tweet D是第一个可见项,之后,Tweet B现在是第一个可见项


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

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

伪代码

关于更新

  offset+= (list_view.length() - list_size)
  list_size = list_view.length()

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

更新列表之前,请按以下方式保存滚动位置-

int position = getListView().getFirstVisiblePosition();
View v = getListView().getChildAt(0);
int top = v == null ? 0 : v.getTop();
然后在更新列表后,您将知道您添加了多少项。所以你可以打电话

yourlistview.setSelectionFromTop(position + <number of items added>, top);
yourlistview.setSelectionFromTop(位置+,顶部);

我的主要问题是,我的所有项目的高度都不相同,因此,像这样滚动可能无法获得之前的“精确”位置,例如,如果某个项目是半可见的……您尝试过吗?因为即使是我的列表也有不同高度的行。但效果很好<代码>int top=v==null?0:v.getTop()此部分实际上处理项目半可见的情况。