我正在尝试在android listview中实现分页.
背景:我通过网络服务下载了约6万个数据集,并使用GreenDao将其保存到SQLite数据库中.现在,我想在ListView中访问此60k行,然后选择一些(0-10).所选项目将发送到仅包含所选内容的另一个ListView.所有60k条目的db条目约为3 MB.
已实施的内容:
> SQLite数据库
> DAO
>列表视图
>适配器
> Transferlogic数据ListView->所选数据列表视图
ListView显示在DialogFragment中.我想到了使用GreenDao LazyList类的想法,因为此列表可以加载单个项目,而无需直接加载所有项目.
由于LazyList不允许更改列表(删除,添加,清除)
我做了以下事情:
ListView有一个Adapter类,该类使用DialogFragment中的java.util.List来查询LazyList(全部获取)或使用EditText来应用like子句.
第一次查询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/