在listview中嵌套gridview时出现内存不足错误

时间:2013-05-13 21:39:11

标签: android memory-management android-listview android-gridview

我正在尝试为我的Android应用程序添加一个GridView图像(ImageView)。我已经成功实现了延迟加载和图像缓存,当我有一个简单的GridView时,我的所有高质量图像都能完美地工作。但是,当我尝试将GridView嵌套在ListView中时,会出现问题。

当我只有一个GridView时,应用程序只需要保持对当前正在屏幕上呈现的图像的引用。但是当我在ListView中嵌入一个GridView,比如说100个高分辨率图像时,应用程序会尝试保留对所有100个图像的引用,当时只有20个图像在屏幕上呈现。我通过我的日志输出找到了这个,每次图像被“读取”时应用程序都会打印一条消息。我会看到该应用程序读取了20个正在屏幕上显示的图像,但随后它会继续前进并阅读更多图像。当它达到大约100~图像时,应用程序将耗尽内存并崩溃。当我只有GridView时,这种情况不会发生;应用程序只会读取20张图像,并在滚动屏幕时加载更多图像。

我怎样才能使我的ListView不会尝试加载子视图中的所有元素(尤其是那些未在屏幕上显示的元素)?

谢谢!

编辑: 对于那些想知道为什么我想在ListView中使用GridView的人,这是因为我正在尝试创建这样的东西: nested GridView

除了我想在ListView中使用它,而不是ExpandableListView。

2 个答案:

答案 0 :(得分:2)

您正在获得此异常,因为在扩展的GridView中,所有数据都加载到内存中,如果您的数据太多,则会导致OutOfMemory异常。
解决方案是:将数据分成小部分,然后尝试。

答案 1 :(得分:0)

您无法在Android中嵌套可滚动视图。 ListView,GridView,ScrollView等组件无法相互嵌套。

你应该看一下Fragments(http://developer.android.com/guide/components/fragments.html)并停下来重新思考一下你的UI。

而且......对于大型数据集,图像/数据延迟加载是不够的......强烈建议你实现一个分页机制,允许用户通过结果页面/内容。

我们假设您一次只显示20个项目。你必须在GridView UI的两侧添加一个Next和一个Previous按钮(或者你可以用手势很酷的方式)...并调整你的GridView的适配器逻辑,只从你的中提取20个项目模型或一次从服务器。

我在书签中发现了一个非常简单的分页实现,其中有一个网格视图:http://paulononaka.wordpress.com/2011/03/19/how-to-implement-a-paging-feature-in-android/ ...我敢打赌有更好的方法可以做到这一点,但它可以给你一些想法。

祝你好运!