我有微调器的自定义适配器:
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
收到了错误的类型?
答案 0 :(得分:0)
如果您收到convertView和getItemViewType(position)== ITEM_TYPE_REGION,那么它并不意味着此视图包含在Tag ViewHolderRegion中,因为视图是重用的。所以你每次都需要膨胀新视图或创建常见的ViewHolder
public static class ViewHolder {
public TextView tvAreaItem;
public TextView tvRegionItem;
}
更新: 看看这个tutorial