何时使用延迟加载,何时不适用?

5

我在数据库中有5000个名称,我希望所有这些名称都可以填充到ListView中。该列表视图应包含以下元素:

  1. 图标图片(存储在Drawables本地)
  2. 名称
  3. 距离,以公里为单位

我正在使用搜索过滤器对此ListView进行筛选,类似于以下内容:

adapter.getFilter().filter(someText);

我还在对ListView进行排序,例如:按字母顺序(A-Z和Z-A)对listView名称进行排序。 在ListView适配器上进行排序,代码如下:

adapter.sort(new Comparator<String>() {

                @Override
                public int compare(String lhs, String rhs) {
                    return lhs.getPlaceName().compareTo(rhs.getPlaceName());
                };
            });

现在我很犹豫是否在列表视图中使用懒加载来加载姓名(因为我有5000多个姓名),考虑到适配器的性能。请给建议。


4
既然它已经是一个数据库了,为什么不使用游标呢?据我所知,这会自动进行惰性加载。 - NickL
1
在这种情况下(例如Play商店应用程序),建议使用分页。首先进行懒加载前100个或更多,并提供“加载下一个100”或“加载上一个100”操作(也许是当用户滚动到顶部或底部时)。将过滤推迟到查询中。 - S.D.
@NickL 我正在使用 David M Chandler 的 stORM:一个针对 Android 上 SQLite 的开源 ORM,它将自动化我的数据库事务。我只能访问数据访问对象,即(我只能在其上执行插入、删除、更新操作)。我不确定是否可以在其中使用游标。 - suresh cheemalamudi
1
@Singularity能否分享更多关于Android中ListView分页的信息? - Harsha M V
@Singularity播放商店应用程序是从URL检索并显示的。但在我的情况下,我已经有了所有本地可用的内容(即地名、距离和图标图像)。那么,如果我使用分页,我将从中受益吗? - suresh cheemalamudi
1
@sureshcheemalamudi 不确定您使用的框架是否可以使用游标,但即使如此,您仍然可以在SQLite数据库本身上使用游标。 游标不需要ORM。 - NickL
1个回答

2

或者,您可以将数据存储在数据库中并进行排序,然后应用惰性加载。因为尽管@Singularity建议的方法非常好,但您可能最终只会对一些块[例如100个]进行排序,而不是整个数据。此外,您需要对每个块进行排序。


我实际需要的是,无论我执行搜索还是排序,它都应该一次性应用于所有5000多个项目。如果我使用懒加载,我能做到这一点吗? - suresh cheemalamudi
将排序后的数据存储到数据库中并检索回来可能是一个巨大的线程工作,我猜测是这样的。 - suresh cheemalamudi
1
嗨,Suresh,懒加载意味着在需要时加载项目。因此,如果您希望对所有5000个项目应用排序,则我认为这将无法解决您的问题。另外,根据您最初的问题,我假设您有一个静态数据库,在运行时不会进行构建。因此,建议事先对其进行排序。如果您没有在运行时向数据库添加项目,则可以事先对表进行排序,然后可以像@Singularity建议的那样利用分页功能。让我知道是否有所帮助。 - HarshalK
感谢您的建议。我通过XML解析将值转储到数据库中。一旦这些值被转储,我现在不会再插入任何值。我所做的只是将这些值填充到列表视图中,并根据需要执行搜索和排序。 - suresh cheemalamudi
1
好的。因此,在解析时,您可以考虑插入排序[按排序顺序将项目插入数据库]。关键是,如果您想使用建议在您的情况下使用的惰性加载[分页],则可能必须首先考虑对数据进行排序。在我看来,既然您无论是否使用惰性加载都必须强制对数据进行排序,为什么不继续使用它并确保UI的响应能力更好呢? - HarshalK
如果我表述不清楚,我只会与数据库交互以获取项目来填充列表视图。但是为了排序和搜索,我只会处理适配器。也就是说,我会对适配器项目进行排序并执行notifydatasetchanged操作。 - suresh cheemalamudi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接