You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:51:26