我正在尝试在android listview中实现分页。
背景:我通过 Web 服务下载大约 60k 数据集,并使用 GreenDao 将它们保存到 SQLite 数据库中。现在我想在 ListView 中访问这 60k 行并选择一些(0-10)。所选项目将发送到另一个仅包含所选内容的 ListView。所有 60k 条目的数据库条目约为 3 MB。
已实施的内容:
ListView 显示在 DialogFragment 中。我想到了使用 GreenDao LazyList 类的想法,因为这个列表可以加载单个项目,而不需要直接加载所有项目。
因为 LazyList 不允许更改列表(删除、添加、清除)
我做了以下事情: ListView 有一个 Adapter 类,它在 DialogFragment 中使用 java.util.List 我查询 LazyList(获取全部)或使用 EditText 来应用类似子句。
第一次查询 60k 条目时,我将前 50 个条目加载到适配器中,并将它们显示在 ListView 中。我不想稍后使用导航栏来更改项目。
我希望 EditText 在用户输入时直接工作,所以我添加了一个 TextChangeListener。
edittext.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if(lazyList != null) {
if(!lazyList.isClosed()) {
lazyList.close();
lazyList = null;
}
}
if(s.length() <= 1) {
QueryBuilder qb = session.getCodeSystemDao().queryBuilder();
lazyList = qb.listLazyUncached();
resetListView();
}
else {
QueryBuilder qb = session.getCodeSystemDao().queryBuilder();
qb.where(DataDao.Properties.Value.like("%"+s.toString()+"%"));
lazyList = qb.listLazyUncached();
resetListView();
}
}
});
问题是:当只输入 1-4 个字符时,列表不会显示,因为光标内存已满,请参阅日志:
W/CursorWindow: Window is full: requested allocation 48 bytes, free space 19 bytes, window size 2097152 bytes
我可以在关闭列表后使用 GC,但在 java 中直接使用 GC 很痛苦。有更好的方法吗? (实际上我尝试过一次但没有成功)。
我需要可搜索的值(许多条目的方式)并且它必须是可排序的。
如果我单击“按字母顺序排序”按钮,它会同时使用 GreenDAO QueryBuilder 中的(edittext [for like] 和 ORDER)来加载新的惰性列表(如 textwatcher + order 子句)。
您可能不应该在这里使用 LazyList。分页通常通过使用 LIMIT 和 OFFSET 参数的查询来完成。
在此处查看“限制、偏移和分页”部分:http://greenrobot.org/greendao/documentation/queries/