【问题标题】:Android ListView with CursorAdapter has Incorrect Scroll Position after Requery is called when new items are added添加新项目时调用 Requery 后,带有 CursorAdapter 的 Android ListView 滚动位置不正确
【发布时间】:2012-12-23 14:53:54
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android android-listview xamarin.android android-cursoradapter


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我的主要问题是我的所有项目的高度都不相同,因此像这样滚动可能无法获得之前的“确切”位置,例如,如果项目是半可见的。 ..
    • 你试过了吗?因为即使是我的列表也有可变高度的行。但工作完美。 int top = v == null ? 0 : v.getTop();这部分实际上处理了一个项目是半可见的情况。
    【解决方案2】:

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

    伪代码

    on_update

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      相关资源
      最近更新 更多