0

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

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

如何使我的 ListView 不会尝试加载子视图中的所有元素(尤其是未显示在屏幕上的元素)?

谢谢!

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

除了我想把它放在 ListView 中,而不是 ExpandableListView。

4

2 回答 2

2

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

于 2013-07-19T04:48:35.603 回答
0

您不能在 Android 中嵌套可滚动视图。ListView、GridView、ScrollView 等组件不能相互嵌套。

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

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

假设您一次要显示 20 个项目。您将不得不在 GridView UI 的两侧添加一个 Next 和一个 Previous 按钮(或者您可以使用手势以很酷的方式进行操作)...并调整您的 GridView 的适配器逻辑以仅从您的模型或从模型中提取 20 个项目服务器一次。

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

祝你好运!

于 2013-05-13T22:50:20.017 回答