对象引用的错误转换:unchecked/unconfirmed 转换

Bad casts of object references: unchecked/unconfirmed cast

考虑以下代码:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView =  (ImageView) convertView; //here

        if (imageView == null) {
            imageView = (ImageView) inflater.inflate(R.layout.item_gallery_image, parent, false);
        }
        ImageLoader.getInstance().displayImage(IMAGE_URLS[position], imageView, options);
        return imageView;
    }

来自 Android Studio 的 Findbugs 插件抱怨方法 getview 的第一行,它说:

Unchecked/unconfirmed投 此强制转换是未经检查的,并且并非从中强制转换的类型的所有实例都可以强制转换为要强制转换为的类型。检查您的程序逻辑是否确保此转换不会失败。

关于如何解决此问题的任何想法?

并非每个 View 都是 ImageView,因此 FindBugs 试图警告您转换可能导致 ClassCastException

但是,您实际上无法获得 ClassCastException,因为 convertView 的工作方式是您要么收到 null,要么收到之前返回的 View getView() 方法。因为你的方法总是 returns 和 ImageView,所以一切都很好。

FindBugs 发现您的代码 潜在 问题,有时它们实际上根本不是问题。

我认为您尝试用图像填充 listView 或回收视图的每一行...首先您应该制作包含图像视图的布局,然后您可以这样做:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        view=inflater.inflate(R.layout.adapter_row,parent,false);
        ImageView mImage=(ImageView) view.findViewById(R.id.imageid);
        ImageLoader.getInstance().displayImage(IMAGE_URLS[position], mImage, options);
        return view;
}

如果你想取悦 FindBugs,你可以断言 convertView 是一个 ImageView。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.item_gallery_image, parent, false);
    }
    assert convertView instanceof ImageView : convertView;
    ImageLoader.getInstance().displayImage(IMAGE_URLS[position], (ImageView) imageView, options);
    return imageView;
}