2017-09-06 75 views
-1

我有一個在Android的問題,我試過了幾個解決方案,但沒有任何工作。不能鑄造持有人 - ListView

當我滾動列表,我得到異常:

java.lang.ClassCastException:com.example.restaurante.SmartMercadoriasAdapter $ FirstViewHolder不能轉換到com.example.restaurante.SmartMercadoriasAdapter $ SecondViewHolder

這是我的代碼:

@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:此段發生異常:

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

特別是在view.getTag()

+0

顯然'tipo.equals(「1」)不正確所有的時間 –

+0

如果tipo是'int'而不是'if(tipo == 1)' –

+0

顯然'getItemViewType'應該返回基於來自給定位置的「mercadoria」而不是某個隨機適配器的字段 – Selvin

回答

0

不要存儲領域,而意見回收

試試這個

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

此外,這沒有任何意義

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

如果Arraylist是空的,這將拋出一個異常,但是如果大小等於1,那麼該位置應該已經是第一個元素

+0

非常感謝。這解決了我的問題 –