【问题标题】:Android SimpleCursorAdapter - Limiting ListView resultsAndroid SimpleCursorAdapter - 限制 ListView 结果
【发布时间】:2026-01-09 07:05:02
【问题描述】:

由于我不在笔记本电脑旁,无法生成任何代码示例,因此我提前道歉,但希望我能清楚地回答我的问题。我有一个由 sqlite db 支持的 ListView(通过 SimpleCursorAdapter)。我正在尝试实现功能,因此该列表一次仅显示来自 db 查询的某些元素。我通过在 onCreate 中加载来自 db 的所有数据,并在启动列表时使用首选元素 # 覆盖 SimpleCursorAdapter 的 getCount 方法来完成此操作。我还有一个按钮,可以将更多元素加载到列表中。这是通过更新 getCount 应该返回的计数来完成的。

这在添加更多列表视图行时效果很好,但是在单击按钮后,我看到列表中的内容出现奇怪的行为。我看到重复的列表元素和不正确的元素内容,它们是在我的 bindview 方法中设置的。我假设这与覆盖 getCount 方法有关(我确信这是执行“Load Next 25”函数的更好方法),因为当我只显示整个 db 结果集时我没有看到这种行为并且不要覆盖该方法。

我想我的问题是,当您处理 SimpleCursorAdapter 时,覆盖 getCount 方法会导致 bindview 方法中的有趣行为吗?使用支持 ListView 的 db 查询结果来实现此类功能的最佳方式是什么?

提前谢谢...如果需要,我明天回到笔记本电脑时可以提供代码 sn-ps。

【问题讨论】:

  • 我不建议这样做。如果数据库包含少于 # 个条目会怎样?我猜这可能会导致不可预测的行为。我会选择 Flo 的解决方案。

标签: android listview simplecursoradapter


【解决方案1】:

我认为您可以通过简单地使用不同的查询来获得结果来归档它。 SQLite 支持LIMIT operator,它可以返回查询的前 n 个结果。

所以你的第一个查询看起来像这样:SELECT [your columns] FROM [your table] LIMIT 25

当按下加载下一个 25 个结果的按钮时,您将创建一个限制为 50 的新查询,并使用 changeCursor() 方法将结果光标绑定到 SimpleCursorAdapter。

【讨论】:

  • 非常感谢您的帮助!我试图在我认为不允许 LIMIT 参数的 db.query() 调用的范围内工作,但我忽略了考虑只使用带有直接 SQL 语句的 execSQL() 方法。我将在我的代码中进行此更改,再次感谢!一个快速跟进的问题......如果我使用这种方法,ListView 会从光标的第一个结果开始吗?换句话说,ListView 会自动滚动回顶部,还是会让用户靠近 ListView 离开的位置,然后按下“Next x”按钮以查看引入的新记录。
  • 不客气。关于你的第二个问题,我不知道列表会如何反应,但我确信有一种方法可以让列表向下滚动到新查询之前的最后一项。虽然在 ListView 类的 setSelection() 和 setSelectionAfterHeaderView() 方法看起来非常有希望解决这个问题之前,我从未使用过它们。
  • 好的,我来看看那些方法。谢谢。
  • 这个解决方案非常好,适用于我们在列表中的情况。任何人都可以推荐逻辑,我们可以从适配器加载以前的行以返回。