在Recycler视图中根据项目名称更改imageview时滞后

时间:2017-05-07 13:51:20

标签: android imageview

我有一张包含图片视图的卡片的回收者视图。项目列表由食谱组成,所以我试图在运行时更改ImageView,检查是否有与食谱名称相对应的drawable(我没有可绘制文件夹中所有食谱的图像)。如果它不存在,我设置一个通用图像。这样做会在滚动回收器视图时导致Lags,有时当我尝试按下后退按钮时它会崩溃。我怎样才能让它更顺畅?

这是我的代码(RecyclerViewAdapter):

int test = ctx.getResources().getIdentifier(recipeName, "drawable", ctx.getPackageName());

    if(test != 0){
        imageView.setImageResource(test);
    }
    else{
        switch(item.getType()){
            case "Colazione":
                imageView.setImageResource(R.drawable.colazione);
                break;
            case "Pranzo":
                imageView.setImageResource(R.drawable.pranzo);
                break;
            case "Spuntino":
                imageView.setImageResource(R.drawable.snack);
                break;
            case "Cena":
                imageView.setImageResource(R.drawable.cena);
                break;
            case "Dessert":
                imageView.setImageResource(R.drawable.dessert);
                break;
            case "Aperitivo":
                imageView.setImageResource(R.drawable.brunch);
                break;

        }

当它崩溃时会启动此异常:

java.lang.OutOfMemoryError: Failed to allocate a 83574412 byte allocation with 16777216 free bytes and 42MB until OOM

1 个答案:

答案 0 :(得分:0)

如果您的所有drawable都位于默认的 drawable 文件夹中,请调整大小并使用dpi限定符将它们放入可绘制目录中:

  • drawable-mdpi
  • 抽拉-HDPI
  • 抽拉-xhdpi
  • 抽拉-xxhdpi
  • 抽拉-xxxhdpi

否则,您可能会因缩放过程而出现内存错误。并避免使用非常高分辨率的图像。例如,如果您显示的图像宽度仅为100dp,则xxhdpi设备的使用率不要高于300px。(xdhdpi密度为1dp = 3px)

  

默认情况下,Android会缩放您的位图drawables(.png,.jpg和.gif文件)和Nine-Patch drawables(.9.png文件),以便它们在每个设备上以适当的物理大小呈现。例如,如果您的应用程序仅为基线(中等屏幕密度(mdpi))提供位图可绘制,则系统在高密度屏幕上进行缩放,并在低密度屏幕上缩小它们。此缩放可能会导致位图中的伪像。为了确保您的位图看起来最好,您应该为不同的屏幕密度添加不同分辨率的替代版本。

Source