组织许多观点

时间:2013-03-07 03:25:26

标签: android listview out-of-memory

我必须创建一个这样的布局:

Screen Shot

如您所见,所有视图(图像,按钮)都在可滚动的屏幕中。这是专辑的布局。

问题是,当我用许多图像显示此相册屏幕时,它会因内存不足而崩溃。

我选择的方法是将所有这些内容放在LinearLayout内的ScrollView内。我知道如果我们需要显示许多视图,我们可以使用listview,但我无法使用ListView组织所有这些视图。

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:1)

您的问题是使用许多位图。请阅读此文章以解决此问题:https://developer.android.com/training/displaying-bitmaps/index.html

答案 1 :(得分:0)

我可以想到两个选择:

  1. 组织项目,使ListView中的每个项目视图都有一组交错的元素,最终可以阻止它们进入ListView元素。顶部/底部的每N个图像必须在视图边界排列。您可以将4-6个图像放置在交错模式中,以便仍然可以实现效果,但该元素块将成为可以回收的视图。

  2. 并排使用两个ListView元素。您可以将OnScrollListener传递给每个ListView以同步其滚动动作,无论触摸哪一个,都会显示它是一个视图。通过这种方式,您可以完全错开图像,但由于必须从一个数据源提供两个视图,因此适配器需要更多工作。

答案 2 :(得分:0)

要制作此类视图,您必须使用线性布局。 喜欢这里

线性布局(垂直)
标题
图像
线性布局水平
{
线性布局垂直
按钮按钮
图像
图像
...
}
线性布局垂直
{
图像
图像
...
}

答案 3 :(得分:0)

您可以使用inSampleSize来减少占用的内存。

这是我的代码

public static Bitmap decodeAndResizeFile(File f) {
    try {
        // Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f), null, o);

        // The new size we want to scale to
        final int REQUIRED_SIZE = 70;

        // Find the correct scale value. It should be the power of 2.
        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 1;
        while (true) {
            if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE)
                break;
            width_tmp /= 2;
            height_tmp /= 2;
            scale *= 2;
        }

        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
    } catch (FileNotFoundException e) {
    }
    return null;
}

此处,它会使用inSampleSize解码图片,此代码会为您找到最佳inSampleSize值。

对我来说很好。

如果你不想使用上面的代码,你也可以使用bitmap.recycle()System.gc()释放未使用的内存。但是,上面的一个对我来说很好。你可以使用两者中的任何一个。

objbitmap.recycle();
objbitmap = null;
System.gc();

希望,这可能会解决问题!