我正在我的应用程序中创建一个ListView,随着时间的推移可能包含数百个项目。是否有任何“最好”的方法来加载大量数据?
我的想法是将它装入块(比如10-20项)。加载第一个块,然后当用户大约滚动一半时,加载下一个块,将其添加到列表的底部(并确保列表滚动偏移不会跳转)。
我刚刚不喜欢的其他一些想法是接受大型http调用的费用并立即加载所有数据,但只是在滚动时将其加载到块中,或者可能添加“下一个x项” “按钮位于底部,或者立即将所有项目加载到列表中并拥有一个大型列表,我无需跟踪。
我个人喜欢我最初的想法,我只是想知道是否有一个首选方法或这样做,如果有任何性能问题,我可以。
有问题的数据将是一个JSON字符串,每个项目将显示一些标题文本,日期,项目作者以及将使用Picasso库下载的图像。
答案 0 :(得分:2)
您最初的想法是我首选的方法,因为它在大多数情况下都能很好地运作。
第二个可能运作良好,但问题是,"大"数据概念是跨设备的相对。对于功能强大的设备,您可以一次加载2000个项目,但它会杀死较旧的较慢的手机。此外,如果您在ListView
的用例是在前100个中选择一个时加载2000个项目,那么您就是在浪费带宽。
第一种方法是可扩展的:你真的不在乎是否有5个项目或5000万,你只需在用户使用它们时加载块。内存使用情况一致。再加上ListView的视图回收,这将占用很小的内存。
对第二种方法说些积极的话:也许在ListView
始终具有相同数据并且很少更改的用例中,例如图像库,您可能想要加载所有数据在应用程序启动并缓存它时,您无需在用户使用应用程序时执行网络请求。如果数据量不大,我会采用第二种方法。但总是要记住,在您需要登记之前,有一个关键的尺寸!
答案 1 :(得分:0)
基本上你可以加载所有项目并显示所有项目(如果你将使用ViewHolder模式和使用Picasso加载延迟图像 - 一切都应该没问题。)如果你有一些商业逻辑迫使你显示数据按页面 - 您可以按照您先描述的方式进行操作 如果您将显示所有数据 - 您可以按列表添加搜索以获得更好的用户体验(当您有页面时也可以这样做但是它会更棘手)。
答案 2 :(得分:0)
前段时间我写了一篇关于类似主题的文章:
http://developer.samsung.com/android/technical-docs/Batch-loading-list
这篇文章还附带了一个小型的常用类库。 也许你会觉得它很有帮助。 欢呼声,