5

我在 Android 上实现了一个简单的无限滚动 GridView。我有以下组件:

  1. 一个带有 onScrollListener 的 GridView,每当 GridView 滚动到最底部时,我都会启动一个 AsyncTask 以将更多项目加载到我的适配器中。
  2. 一个适配器,它附加从 AsyncTask 获取的项目,并触发 notifyDataChanged() 以便 GridView 可以自行刷新。

这似乎工作正常,除非在这种情况下适配器无限增长......我的意思是每当用户滚动到最后时,我都会将项目附加到这个适配器,这似乎是一个内存问题。

实现无限适配器的正确方法是什么?我正在寻找概念,而不是为我做的第三方罐子。

谢谢

解决方案
标记的答案具有正确的理论。我的实现将加载的数据备份到sqllite数据库中,所以整体流程是:在一个线程中从互联网下载数据,在一个线程中解析并将数据存储到数据库中,在UI线程上触发notifyDataChanged。
适配器的 getCount() 方法只是简单地从数据库中选择 count(id),然后一次从数据库中检索一批对象到内存中供适配器使用。

4

1 回答 1

3

是的,一般来说,如果你GridView是无限的,那么你Adapter就是无限的。如果您只是将更多数据加载到内存中的幼稚实现,那么您肯定会在某些时候遇到内存问题。为了解决这个问题,您必须在某个时候发布旧数据。

假设您的适配器可以访问一些“无限”存储,它从(通常是互联网)获取数据,您可以考虑设置数据的最大大小(以字节为单位或以项目计数为单位)以保存在您的适配器的内存中。当您超过最大大小时,您可以从内存中清除旧项目。如果再次请求这些旧项目,则从无限存储而不是从内存中再次加载它们(并且可能会从内存中清除其他旧项目)。

这意味着您的GridView项目是从Adapter将数据存储在某种缓存中(LruCache可能在这里有用)中构建的,该缓存由某些(可能是外部的)存储支持。您还可以在内存缓存和外部存储之间放置一个磁盘缓存。

于 2013-01-07T18:38:01.713 回答