Integer能否返回Drawable?ArrayList存储drawable资源问题咨询
核心结论
你当前代码的类型不匹配问题本质是数据类型认知偏差:
R.drawable.img1是Android SDK自动生成的int类型资源编号,自动装箱后为Integer类型,完全不是ImageView类型,所以往声明泛型为ImageView的集合中添加时IDE会提示类型错误。- 如果你按提示把集合泛型改为
Integer,集合里存储的只是图片的资源ID编号,不是图片本身、也不是ImageView控件实例,直接取出元素拿到的是int类型的数字ID,不会直接返回可显示的图像。
不同需求对应的正确写法
如果你要存储可直接使用的图片Drawable对象
集合泛型指定为Drawable,添加元素时先通过资源ID查询到实际Drawable实例再存入:ArrayList<Drawable> drawableList = new ArrayList<>(); // 添加资源,Android 5.0+推荐传入主题参数适配样式 drawableList.add(getResources().getDrawable(R.drawable.img1, getTheme()));取出元素时直接拿到Drawable对象,可直接调用
imageView.setImageDrawable()方法显示。如果你只需要统一管理图片资源ID
直接按IDE提示将泛型改为Integer即可,取出ID后需要配合资源加载方法才能拿到对应图片:ArrayList<Integer> imgResList = new ArrayList<>(); imgResList.add(R.drawable.img1); // 取出使用示例 int imgResId = imgResList.get(0); imageView.setImageResource(imgResId);如果你确实要存储ImageView控件实例
集合泛型保持ImageView即可,但存入的必须是ImageView类的实例对象,不能直接塞资源ID:ArrayList<ImageView> imgViewList = new ArrayList<>(); ImageView tempIv = findViewById(R.id.temp_iv); // 或者直接new ImageView(context)创建实例 tempIv.setImageResource(R.drawable.img1); imgViewList.add(tempIv);
注意:不要尝试将Integer类型的资源ID强转为Drawable或ImageView类型,运行时会直接抛出类型转换异常,资源ID必须通过系统提供的资源加载接口才能转换为实际的资源对象。
内容的提问来源于stack exchange,提问作者Chunchunmaru
相关产品推荐
相关产品推荐

