2013-10-11 86 views
1

我想设置一个listview有四种不同的布局,每种类型的行(4种类型的行),我使用ViewHolder。

但我收到一个奇怪的问题,我无法修复。我的意见(所有4),有一个CheckBox,一些CheckBox必须被标记和禁用,当我有很多行这个列表视图,我滚动它,我的CheckBox得到检查和取消选中,启用和禁用..

我相信我的问题与回收视图有关,但我没有得到它是什么。
这里我发表我的一些代码:ListView回收视图

class MyAdapter extends BaseAdapter { 

private FragmentActivity activity; 
private List<Extra> data; 
private static LayoutInflater inflater=null; 
private ManifestData manifest; 
private Context context; 

final List<ExtraRow> rows; 

MyAdapter(List<Extra> extras, FragmentActivity activity, Context context) { 
    rows = new ArrayList<ExtraRow>(); 
    this.activity = activity; 
    this.context = context; 

    for (Extra e : extras) { 
     if (e.getPriceType()==1) { 
      rows.add(new ExtraRowType1(LayoutInflater.from(context), e, activity)); 
     } else if (e.getPriceType()==2){ 
      rows.add(new ExtraRowType2(LayoutInflater.from(context), e, activity)); 
     } else if (e.getPriceType()==3){ 
      rows.add(new ExtraRowType3(LayoutInflater.from(context), e, activity)); 
     } else if (e.getPriceType()==4){ 
      rows.add(new ExtraRowType4(LayoutInflater.from(context), e, activity)); 
     } 
    } 
} 

@Override 
public int getViewTypeCount() { 
    return 4; 
} 

@Override 
public int getItemViewType(int position) { 
    return rows.get(position).getViewType(); 
} 

public int getCount() { 
    return rows.size(); 
} 

public Object getItem(int position) { 
    return position; 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    return rows.get(position).getView(convertView); 
} 

}


我的一个行(其它非常相似,但是有一些用户界面的变化):

public class ExtraRowType3 implements ExtraRow{ 
private final Extra extra; 
private final LayoutInflater inflater; 
final FragmentActivity activity; 
private ViewHolder holder; 

public ExtraRowType3(LayoutInflater inflater, Extra extra, FragmentActivity activity) { 
    this.extra = extra; 
    this.inflater = inflater; 
    this.activity = activity; 
} 

@Override 
public View getView(View convertView) { 
    View view; 

    if (convertView == null) { 
     ViewGroup viewGroup = (ViewGroup)inflater.inflate(R.layout.reservas_extras_3, null); 

     holder = new ViewHolder((TextView)viewGroup.findViewById(R.id.reservas_extras_titulo), 
           (CheckBox)viewGroup.findViewById(R.id.reservas_extras_3_checkbox), 
           (TextView)viewGroup.findViewById(R.id.reservas_extras_total)); 
     viewGroup.setTag(holder); 
     view = viewGroup; 
    } else { 
     holder = (ViewHolder)convertView.getTag(); 
     view = convertView; 
    } 

    holder.title.setText(extra.getNombre()); 

    if(extra.isObligatorio()){ 
     holder.checkBox.setChecked(true); 
     holder.checkBox.setClickable(false); 
    }else{ 
     Disponibilidad d = Disponibilidad.getInstance(); 
     if(d.getExtraReserva(extra.getId())!=null){ 
      holder.checkBox.setChecked(true); 
     }else{ 
      holder.checkBox.setChecked(false); 
      holder.checkBox.setClickable(true); 
     } 
    } 

    holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      ExtraReserva extraReserva = new ExtraReserva(extra.getId(), "", -1, -1, 1, extra.isSuplemento()); 
      Disponibilidad d = Disponibilidad.getInstance(); 
      if(isChecked){ 
       d.addExtra(extraReserva); 
      } 
      else d.deleteExtra(extraReserva.getIdExtra()); 
     } 
    }); 

    return view; 
} 

@Override 
public int getViewType() { 
    return extra.getTipoPrecio(); 
} 

private static class ViewHolder { 
    final TextView title; 
    final CheckBox checkBox; 
    final TextView total; 

    private ViewHolder(TextView title, CheckBox checkBox, TextView total) { 
     this.title = title; 
     this.checkBox = checkBox; 
     this.total = total; 
    } 
} 

}

非常感谢您的帮助。

回答

0

您的意见是在他们离开的状态下进行回收。因此,如果在离开屏幕时检查了视图,系统将重新使用该视图(convertView),因此必须明确重新初始化该视图。

可能会导致问题的Antoher事物是您定义ViewHolder的地方。它应该是getView()中的局部变量而不是类字段。我猜测它会造成奇怪的行为setOnCheckedChangeListener

0

此代码是否已更新?因为当你回答我的问题时,你说你不是在回收你的观点。但是在这里我看到你将convertView传递到你的ExtraRow实现的getView方法中,并且在getView中,如果你使用null - > inflate或者getTag,那么你通常会这样做。

+0

这是我的代码,因为它应该工作,无用的临时修复是在我的实际项目:) – Darknoe