繁体   English   中英

ViewHolder和导航抽屉问题

[英]Problems with viewHolder and navigation drawer

我正在尝试将导航抽屉配置为显示3种不同的“行”,但是在Holder遇到问题时,该消息被告知:

致命异常:main java.lang.ClassCastException:$ com.coderockr.socialbase.row.ImageRow ViewHolder无法转换为com.coderockr.socialbase.row.DescriptionRow $ ViewHolder

代码在这里:

public class MenuAdapter extends BaseAdapter {

private final Context mContext;
private final ArrayList<MenuItemModel> mItems;
private final int mCount;
private final List<Row> rows;

public MenuAdapter(Context context, ArrayList<MenuItemModel> items) {
    mContext = context;
    mItems = items;
    mCount = mItems.size();
    rows = new ArrayList<Row>();

    for(MenuItemModel model : mItems) {
        if((model.ismItemType()) && (model.getCounter() == null)) {
            rows.add(new BarRow(LayoutInflater.from(mContext), model));
        } else if(model.getImageId() != null) {
            rows.add(new ImageRow(LayoutInflater.from(mContext), model));
        } else {
            rows.add(new DescriptionRow(LayoutInflater.from(mContext), model));
        }
    }
}

@Override
public int getCount() {
    return mCount;
}

@Override
public MenuItemModel getItem(int position) { return mItems.get(position); }

@Override
public long getItemId(int position) { return getItem(position).getPosition(); }

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

DescriptionRow:

public class DescriptionRow implements Row {
private final MenuItemModel item;
private LayoutInflater inflater;
private int mCounter;

public DescriptionRow(LayoutInflater inflater, MenuItemModel item) {
    this.item = item;
    this.inflater = inflater;
}

@Override
public View getView(View convertView) {
    ViewHolder holder;
    View view;

    mCounter = Integer.parseInt(item.getCounter());

    if(convertView == null) {
        ViewGroup viewGroup = (ViewGroup)inflater.inflate(R.layout.text_row, null);
        holder = new ViewHolder((TextView)viewGroup.findViewById(R.id.title),
                (TextView)viewGroup.findViewById(R.id.description),
                (RelativeLayout)viewGroup.findViewById(R.id.relativeLayout_circle));
        viewGroup.setTag(holder);
        view = viewGroup;
    } else {
        view = convertView;
        holder = (ViewHolder)convertView.getTag();
    }
    holder.titleView.setText(item.getitemName());
    holder.descriptionView.setText(item.getitemName());
    if(mCounter < 1) {
        holder.relativeLayout_Cicle.setVisibility(View.INVISIBLE);
    }
    return view;
}

@Override
public int getViewType() { return RowType.DESCRIPTION_ROW.ordinal(); }

public static class ViewHolder {
    final TextView titleView;
    final TextView descriptionView;
    final RelativeLayout relativeLayout_Cicle;

    private ViewHolder(TextView titleView, TextView descriptionView, RelativeLayout relativeCicle) {
        this.titleView = titleView;
        this.descriptionView = descriptionView;
        this.relativeLayout_Cicle = relativeCicle;
    }
}

}

有什么问题?

您忘记告诉Adapter您支持多少种不同的类型:

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

固定!

我发现我缺少重写两个方法:

@Override
public int getViewTypeCount() {
    return RowType.values().length;
}

@Override
public int getItemViewType(int position) {
    return rows.get(position).getViewType();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM