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

时间:2016-02-02 16:10:51

标签: 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;

    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;
    }
}

这是我的数据:

 public static __KeyValueObject[] AREA = {
            new __KeyValueObject(50, "Region 1", true),
            new __KeyValueObject(100, "area 1-1"),
            new __KeyValueObject(200, "area 1-2"),
            new __KeyValueObject(300, "area 1-3"),
            new __KeyValueObject(800, "Region 2", true),
            new __KeyValueObject(900, "area 2-1"),
            new __KeyValueObject(1000, "area 2-2"),
            new __KeyValueObject(1100, "area 2-3"),
            new __KeyValueObject(1200, "area 2-4")
}

当我在getCustomView中出于某种原因按下微调器时,第一个电话会正确。第二次调用getCustomView我获得的项目类型为ITEM_TYPE_AREA,但我获得的convertView类型为ViewHolderRegion,因此尝试强制转换:holderArea = (ViewHolderArea) convertView.getTag();崩溃。

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

1 个答案:

答案 0 :(得分:0)

如果您收到convertView和getItemViewType(position)== ITEM_TYPE_REGION,那么它并不意味着此视图包含在Tag ViewHolderRegion中,因为视图是重用的。所以你每次都需要膨胀新视图或创建常见的ViewHolder

public static class ViewHolder {
    public TextView tvAreaItem;
    public TextView tvRegionItem;
}

更新: 看看这个tutorial