我正在尝试在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/
总结以上是内存溢出为你收集整理的java-如何正确使用GreenDao LazyList处理大量数据并进行排序和过滤全部内容,希望文章能够帮你解决java-如何正确使用GreenDao LazyList处理大量数据并进行排序和过滤所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)