2017-09-06 1 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가'if (tipo == 1)'보다'int' 인 경우 –

+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

고마워요. 그게 내 문제를 해결 했어. –

관련 문제