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()에
는
분명히 tipo.equals ("1")'이 (가) 올바르지 않습니다. 모든 시간 –
만약 tipo가'if (tipo == 1)'보다'int' 인 경우 –
명백히'getItemViewType'는 임의의 어댑터의 필드가 아닌 주어진 위치에서 "mercadoria"를 기반으로 무언가를 리턴해야합니다. – Selvin