2017-09-06 1 views
-1

Ich habe ein Problem in Android, und ich habe versucht, ein paar Lösungen, aber nichts funktioniert.Kann nicht Holder - ListView

Wenn ich die Liste scrollen, bekomme ich die Ausnahme:

java.lang.ClassCastException: com.example.restaurante.SmartMercadoriasAdapter $ FirstViewHolder kann nicht auf com.example.restaurante.SmartMercadoriasAdapter $ SecondViewHolder gegossen werden

Das ist mein 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: Die Ausnahme in diesem Abschnitt auftritt:

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

Insbesondere in view.getTag()

+0

Anscheinend ist tipo.equals ("1") nicht korrekt bei alle Zeiten –

+0

wenn tipo ist als 'int' als' if (tipo == 1) ' –

+0

Offensichtlich sollte' getItemViewType' etwas basierend auf "mercadoria" von gegebener Position nicht auf irgendein zufälliges Adapterfeld – Selvin

Antwort

0

nicht Felder lagern, während Ansichten

recycelt werden versuchen diese

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

Auch dies macht keinen Sinn

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

Wenn die Arraylist leer ist, wird dies eine Ausnahme auslösen, aber wenn die Größe gleich eins ist, dann sollte die Position bereits das erste Element sein

+0

Vielen Dank. Das ist mein Problem gelöst –

Verwandte Themen