我有一张包含图片视图的卡片的回收者视图。项目列表由食谱组成,所以我试图在运行时更改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
答案 0 :(得分:0)
如果您的所有drawable都位于默认的 drawable 文件夹中,请调整大小并使用dpi限定符将它们放入可绘制目录中:
否则,您可能会因缩放过程而出现内存错误。并避免使用非常高分辨率的图像。例如,如果您显示的图像宽度仅为100dp,则xxhdpi设备的使用率不要高于300px。(xdhdpi密度为1dp = 3px)
默认情况下,Android会缩放您的位图drawables(.png,.jpg和.gif文件)和Nine-Patch drawables(.9.png文件),以便它们在每个设备上以适当的物理大小呈现。例如,如果您的应用程序仅为基线(中等屏幕密度(mdpi))提供位图可绘制,则系统在高密度屏幕上进行缩放,并在低密度屏幕上缩小它们。此缩放可能会导致位图中的伪像。为了确保您的位图看起来最好,您应该为不同的屏幕密度添加不同分辨率的替代版本。