2017-09-06 1 views
-1

J'ai un problème avec Android, et j'ai essayé quelques solutions, mais rien ne fonctionne.Can not Cast Holder - ListView

Lorsque je fais défiler la liste je reçois l'exception:

java.lang.ClassCastException: com.example.restaurante.SmartMercadoriasAdapter $ FirstViewHolder ne peut pas être jeté à com.example.restaurante.SmartMercadoriasAdapter $ SecondViewHolder

ce mon 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: L'exception se produit dans ce tronçon:

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(); 

Plus précisément dans view.getTag()

+0

Apparemment 'tipo.equals (" 1 ")' n'est pas correct à tous les temps –

+0

si tipo est aussi 'int' que 'if (tipo == 1) ' –

+0

Il est évident que' getItemViewType' devrait retourner quelque chose basé sur "mercadoria" à partir d'une position donnée et non sur le champ de l'adaptateur – Selvin

Répondre

0

Ne pas stocker les champs alors que les vues sont recyclés

Essayez cette

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

En outre, cela n'a pas de sens

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

Si l'Arraylist est vide, une exception sera émise, mais si la taille est égale à un, alors la position devrait déjà être le premier élément

+0

Merci beaucoup. Thats a résolu mon problème –