Android 适配器中接收到的convertView类型错误

Android 适配器中接收到的convertView类型错误,android,custom-adapter,Android,Custom Adapter,我有用于微调器的自定义适配器: public class AreaArrayAdapter extends ArrayAdapter<__KeyValueObject[]> { private static final int ITEM_TYPE_AREA = 0; private static final int ITEM_TYPE_REGION = 1; private static final int NO_OF_TYPES = 2; pr

我有用于微调器的自定义适配器:

public class AreaArrayAdapter extends ArrayAdapter<__KeyValueObject[]> {

    private static final int ITEM_TYPE_AREA = 0;
    private static final int ITEM_TYPE_REGION = 1;

    private static final int NO_OF_TYPES = 2;

    private LayoutInflater mLayoutInflater;
    private __KeyValueObject[] mItems;

    public AreaArrayAdapter(Context context, int resource, __KeyValueObject[] items) {
        super(context, resource);
        mItems = items;
        mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getItemViewType(int position) {
        int type = -1;
        if (mItems[position].bool_val == true) {
            type = ITEM_TYPE_REGION;
        } else {
            type = ITEM_TYPE_AREA;
        }
        return type;
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        return getCustomView(position, convertView, parent);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return getCustomView(position, convertView, parent);
    }

    @Override
    public boolean areAllItemsEnabled() {
        return false;
    }

    @Override
    public boolean isEnabled(int position) {
        if (mItems[position].bool_val == true) {
            return true;
        } else {
            return true;
        }
    }

    @Override
    public int getCount() {
        return mItems.length;
    }

    @Override
    public int getViewTypeCount() {
        return NO_OF_TYPES;
    }

    public View getCustomView(int position, View convertView, ViewGroup parent) {
        int type = getItemViewType(position);

        if (type == ITEM_TYPE_AREA) {
            ViewHolderArea holderArea = null;
            if (convertView == null) {
                holderArea = new ViewHolderArea();
                convertView = mLayoutInflater.inflate(R.layout.row_spinner_area_item, null);
                holderArea.tvAreaItem = (TextView) convertView.findViewById(R.id.tvAreaItem);
                convertView.setTag(holderArea);
            } else {
                holderArea = (ViewHolderArea) convertView.getTag();
            }
            holderArea.tvAreaItem.setText(mItems[position].value);
        } else // type == ITEM_TYPE_REGION
        {
            ViewHolderRegion holderRegion = null;
            if (convertView == null) {
                holderRegion = new ViewHolderRegion();
                convertView = mLayoutInflater.inflate(R.layout.row_spinner_region_item, null);
                holderRegion.tvRegionItem = (TextView) convertView.findViewById(R.id.tvRegionItem);
                convertView.setTag(holderRegion);
            } else {
                holderRegion = (ViewHolderRegion) convertView.getTag();
            }
            holderRegion.tvRegionItem.setText(mItems[position].value);
        }

        return convertView;
    }

    public static class ViewHolderArea {
        public TextView tvAreaItem;
    }

    public static class ViewHolderRegion {
        public TextView tvRegionItem;
    }
}
当我出于某种原因在
getCustomView
中按下微调器时,第一个调用将向右进行。对
getCustomView
的第二次调用是我得到的项的类型
item_type_AREA
,但是我得到的
convertView
是类型
ViewHolderRegion
的,因此尝试强制转换:
holderArea=(ViewHolderArea)convertView.getTag()崩溃


知道为什么接收到的
convertView
类型错误吗?

如果接收到convertView和getItemViewType(position)==ITEM\u type\u区域,这并不意味着此视图包含在标记ViewHolderRegion中,因为视图是可重用的。因此,每次都需要为新视图充气或创建通用的ViewHolder

public static class ViewHolder {
    public TextView tvAreaItem;
    public TextView tvRegionItem;
}
更新:
看看这个

是你的
\uu KeyValueObject
的2参数构造函数吗?将
bool\u val
设置为false?试着用
if
替换
else
条件,比如
if(type==ITEM\u type\u REGION)
@JimRhodes是的,bool\u val默认设置为false。@dsb,你的代码在我看来是正确的。如果尚未解决此问题,请发布uu KeyValueObject类的代码。您可能还希望向getItemViewType添加一些日志记录,以确保为每个位置获取正确的类型。或者在那里设置一个断点。@JimRhodes谢谢你的帮助。代码对我仍然不起作用。ExternalLoginCallback的实现非常简单:公共类uuKeyValueObject{public uuuKeyValueObject(int键,字符串值,布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔布尔{this.key=key;this.value=value;this.bool_val=false;}公共int-key;公共字符串值;公共布尔bool_val;}.有什么建议吗?谢谢。我对自定义适配器有很多经验,我对本教程也很熟悉。但是,过去当我使用多种类型的项目时,我总是收到正确类型的convertView。对于X种类型,Android管理X个可重用对象列表,并将正确类型发送到getView(…).这次不行!我看不出我犯的错误在哪里。这肯定是我的代码中的某些内容。@dsb我想你应该更新一下关于ViewHolder模式的知识。
public static class ViewHolder {
    public TextView tvAreaItem;
    public TextView tvRegionItem;
}