我有一个ListView
设置从一个游标抓住数据库中的前10行(LIMIT)。如何获得没有限制的游标计数?
cursor = db.query("MYTABLE",
new String[]{"_id", "NUMBER", "NAME"}, null, null, null, null, null, "10");
该列表设置为“无限滚动”。它通过(从OnScrollListener
onScroll
)比较列表中的项目的滚动完成的数量,一旦在数据库中的项目数
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if(firstVisibleItem+visibleItemCount == totalItemCount && totalItemCount!=0)
{
ListView listView = (ListView) findViewById(R.id.my_list);
long numberOfItemsInDB = DatabaseUtils.queryNumEntries(db, "MYTABLE");
long numberOfItemsInList = listView.getAdapter().getCount();
long difference = numberOfItemsInDB - numberOfItemsInList;
if (difference > 0) {
... //do stuff here
}
这工作。但是有时这个列表可能会被自定义光标的项目填充(例如,来自搜索过滤),所以我需要该光标的项目数。我可以通过使用.getCount()
来保持一致的计数,但是如果我已经使用了LIMIT,那么它就会返回我已经是10的LIMIT。
如何获取游标中的项数忽略限制?
你的代码是用你通常会从远程服务器获取数据使用分页方法计数。当您从本地数据库获取数据时,您不需要该分页逻辑。 'Cursor'类 - 特别是'SQLiteCursor'类 - 在内部处理所有分页。通过一个'CursorAdapter'和一个循环'ListView',你拥有了你需要的一切。把你想要的整个数据集的查询放进去,得到'Cursor',并让'CursorAdapter'和'ListView'完成剩下的工作。 –
@krislarson所以我应该让我的游标拉动整个数据库并使用cursoradapter来限制它?我不确定你的分页逻辑是什么意思,在哪里建立到列表视图,它可以处理自动滚动负载开箱即用? – Prof
通过分页我的意思是你放在'onScroll'方法中的逻辑 - 向下滚动直到某个点,然后去获得更多的项目来显示。这10个项目将代表一个“页面”。现在,当你运行一个查询并生成一个'Cursor'时,整个查询数据就不会进入内存。如果你愿意,你可以查找类似'CursorWindow'的类,并阅读源代码以查看游标的工作方式。尽管如此,如果您在“ListView”中查询所需的所有内容,并将得到的“Cursor”放入“CursorAdapter”中,您将能够滚动浏览整个列表,而不会出现明显的性能问题。 –