-1

I have a problem in Android, and Ive tried a couple of solutions, but nothing work.

When I scroll the list I get the exception:

java.lang.ClassCastException: com.example.restaurante.SmartMercadoriasAdapter$FirstViewHolder cannot be cast to com.example.restaurante.SmartMercadoriasAdapter$SecondViewHolder

This my code:

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

@Override
public int getItemViewType(int position) {
    if (tipo.equals("1"))
        return 0;
    else
        return 1;
}

@Override
public View getView(int position, View view, ViewGroup parent) {
    MyListSmartMercadoria mercadoria = null;
    if(mercadorias.size() > 1){
        mercadoria = mercadorias.get(position);
    }else{
        mercadoria = mercadorias.get(0);
    }
    tipo       = "";

    tipo = mercadoria.getTipo();

    int viewType = getItemViewType(position);

    switch (viewType) {

        case 0: {
            FirstViewHolder firstViewHolder = null;

            if(view == null){
                view = LayoutInflater.from(getContext()).inflate(R.layout.merc_lista_smart_adp, parent, false);
                firstViewHolder = new FirstViewHolder(view);
                view.setTag(firstViewHolder);
            }
            else {
                firstViewHolder = (FirstViewHolder)view.getTag();
            }

            firstViewHolder.mTipo.setText(tipo);

            String codigo = mercadoria.getCod();
            if(codigo.matches("[0-9]+")){
                int codI = Integer.parseInt(mercadoria.getCod());
                codigo = "[";
                codigo += String.format("%06d", codI);
                codigo += "]";
            }else{
                codigo = "[";
                codigo += codigo;
                int cont = 6 - codigo.length();
                for(int i = 0; i < cont; i++){
                    codigo = codigo + " ";
                }
                codigo += "]";
            }
            firstViewHolder.mCodigo.setText(codigo);

            firstViewHolder.mDescricao.setText(mercadoria.getNome());
            firstViewHolder.mPreco.setText(mercadoria.getPreco());

            break;
        }

        case 1: {
            SecondViewHolder holder = null;

            if(view == null){
                view = LayoutInflater.from(getContext()).inflate(R.layout.merc_sub_lista_smart_adp, parent, false);
                holder = new SecondViewHolder(view);
                view.setTag(holder);
            }
            else holder = (SecondViewHolder)view.getTag();

            holder.mTipo.setText(tipo);

            String codigo = mercadoria.getCod();
            if(codigo.matches("[0-9]+")){
                int codI = Integer.parseInt(mercadoria.getCod());
                codigo = "[";
                codigo += String.format("%06d", codI);
                codigo += "]";
            }else{
                codigo = "[";
                codigo += codigo;
                int cont = 6 - codigo.length();
                for(int i = 0; i < cont; i++){
                    codigo = codigo + " ";
                }
                codigo += "]";
            }
            holder.mCodigo.setText(codigo);

            holder.mDescricao.setText(mercadoria.getNome());
            holder.mQuant.setText(mercadoria.getPreco());

            break;
        }
    }

    return view;

}

protected class SecondViewHolder {
    TextView mTipo;
    TextView mCodigo;
    TextView mDescricao;
    EditText mQuant;

    public SecondViewHolder(View view) {
        mCodigo = (TextView) view.findViewById(R.id.text_view_cod_merc);
        mTipo = (TextView) view.findViewById(R.id.text_view_tipo_merc);
        mDescricao = (TextView) view.findViewById(R.id.text_view_nome_merc);
        mQuant = (EditText) view.findViewById(R.id.text_view_preco_merc);
    }
}

protected class FirstViewHolder {
    TextView mTipo;
    TextView mCodigo;
    TextView mDescricao;
    TextView mPreco;

    public FirstViewHolder(View view) {
        mCodigo = (TextView) view.findViewById(R.id.text_view_cod_merc);
        mTipo = (TextView) view.findViewById(R.id.text_view_tipo_merc);
        mDescricao = (TextView) view.findViewById(R.id.text_view_nome_merc);
        mPreco = (TextView) view.findViewById(R.id.text_view_preco_merc);
    }
}

EDIT1: The exception occurs in this stretch:

if(view == null){
            view = LayoutInflater.from(getContext()).inflate(R.layout.merc_sub_lista_smart_adp, parent, false);
            holder = new SecondViewHolder(view);
            view.setTag(holder);
        }
        else holder = (SecondViewHolder)view.getTag();

Specifically in view.getTag()

1 Answers1

0

Don't store fields while views are recycled

Try this

@Override
public int getItemViewType(int position) {
    String tipo = mercadorias.get(position).getTipo();
    if (tipo.equals("1"))
        return 0;
    else
        return 1;
}

Also, this doesn't make sense

if(mercadorias.size() > 1){
    mercadoria = mercadorias.get(position);
}else{  
    mercadoria = mercadorias.get(0);
}

If the Arraylist is empty, this will throw an exception, but if the size is equal to one, then the position should already be the first element

OneCricketeer
  • 179,855
  • 19
  • 132
  • 245