为什么当我在选中 CheckBox 的情况下滚动 ListView 时,它会变成未选中状态?
Why When I scroll my ListView with CheckBox selected it becomes unselected?
我在这里看到一些帖子在谈论这个,但我没有看到任何解决我的问题的答案。
我有这个带有一些 TextView 和一个 CheckBox 的 ListView,一切正常,只是当我滚动列表时,一些选中的变为未选中。
这是我的 getView 适配器代码:
public View getView(int position, View convertView, ViewGroup parent) {
Agendamento item = getItem(position);
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.item_lista_agendamento, parent, false);
viewHolder.campoNomeCliente = (TextView) convertView.findViewById(R.id.campoNomeCliente);
viewHolder.campoNomePaciente = (TextView) convertView.findViewById(R.id.nomePaciente);
viewHolder.campoNomeMedico = (TextView) convertView.findViewById(R.id.campoNomeMedico);
viewHolder.campoCorStatus = (TextView) convertView.findViewById(R.id.campoCorStatus);
viewHolder.campoCorStatus = (TextView) convertView.findViewById(R.id.campoCorStatus);
viewHolder.campoDataHoraInc = (TextView) convertView.findViewById(R.id.campoDataHoraInc);
CheckBox chk = (CheckBox) convertView.findViewById(R.id.marcado);
viewHolder.chkMarcado = chk;
viewHolder.chkMarcado.setTag(position);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
String codigoMedico = item.getCodigoMedico();
String codigoCliente = item.getCodigoCliente();
Medico medico = rep.getMedicoPorCodigo(codigoMedico);
Cliente cliente = rep.getClientePorCodigo(codigoCliente);
String status = item.getStatus().trim();
int backgroundColor = 0;
if (status.equals("S")) {
backgroundColor = R.color.corSeparada;
}
if (status.equals("F")) {
backgroundColor = R.color.corFinalizada;
}
if (status.equals("E")) {
backgroundColor = R.color.corEncerrada;
}
if (status.equals("N")) {
backgroundColor = R.color.corNova;
}
String dataInc = item.getDataInclusao().replaceAll("[/]", "");
String dataBr = "";
if (!dataInc.trim().equals("")) {
String dia = dataInc.substring(4, 6);
String mes = dataInc.substring(6, 8);
String ano = dataInc.substring(0, 4);
dataBr = dia + "/" + mes + "/" + ano;
}
String horaInc = item.getHoraInclusao().trim();
dataBr += " " + horaInc;
viewHolder.campoCorStatus.setBackgroundResource(backgroundColor);
viewHolder.campoNomeCliente.setText(cliente == null ? "(cliente)" : cliente.getNome());
viewHolder.campoNomePaciente.setText(item.getNomePaciente());
viewHolder.campoNomeMedico.setText(medico == null ? "(médico)" : medico.getNome());
viewHolder.campoDataHoraInc.setText(dataBr + " (" + item.getId() + ")");
final Agendamento item1 = item;
viewHolder.chkMarcado.setOnCheckedChangeListener(null);
viewHolder.chkMarcado.setChecked(item.isSelected());
viewHolder.chkMarcado.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
selectedList.add(item1);
} else {
selectedList.remove(item1);
}
}
});
if (position % 2 == 0) {
convertView.setBackgroundResource(R.drawable.cor_zebra2);
} else {
convertView.setBackgroundResource(R.drawable.cor_zebra1);
}
// Return the completed view to render on screen
return convertView;
}
这是向上滚动前的结果,向上滚动后那些选中的复选框变为未选中:
ListView
的工作方式是循环使用不同数据填充的相同视图。因此,需要视图持有者模式,看起来您正在使用它。
因此,为了使您的列表正常工作,您需要将选中状态保存到支持数据模型中。看起来您的模型中可能已经有一个 "selected" 布尔值?如果是这样,你只需要将状态保存到这个布尔值。
viewHolder.chkMarcado.setChecked(item.isSelected());
viewHolder.chkMarcado.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
item.setSelected(isChecked);
}
});
我在这里看到一些帖子在谈论这个,但我没有看到任何解决我的问题的答案。
我有这个带有一些 TextView 和一个 CheckBox 的 ListView,一切正常,只是当我滚动列表时,一些选中的变为未选中。
这是我的 getView 适配器代码:
public View getView(int position, View convertView, ViewGroup parent) {
Agendamento item = getItem(position);
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.item_lista_agendamento, parent, false);
viewHolder.campoNomeCliente = (TextView) convertView.findViewById(R.id.campoNomeCliente);
viewHolder.campoNomePaciente = (TextView) convertView.findViewById(R.id.nomePaciente);
viewHolder.campoNomeMedico = (TextView) convertView.findViewById(R.id.campoNomeMedico);
viewHolder.campoCorStatus = (TextView) convertView.findViewById(R.id.campoCorStatus);
viewHolder.campoCorStatus = (TextView) convertView.findViewById(R.id.campoCorStatus);
viewHolder.campoDataHoraInc = (TextView) convertView.findViewById(R.id.campoDataHoraInc);
CheckBox chk = (CheckBox) convertView.findViewById(R.id.marcado);
viewHolder.chkMarcado = chk;
viewHolder.chkMarcado.setTag(position);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
String codigoMedico = item.getCodigoMedico();
String codigoCliente = item.getCodigoCliente();
Medico medico = rep.getMedicoPorCodigo(codigoMedico);
Cliente cliente = rep.getClientePorCodigo(codigoCliente);
String status = item.getStatus().trim();
int backgroundColor = 0;
if (status.equals("S")) {
backgroundColor = R.color.corSeparada;
}
if (status.equals("F")) {
backgroundColor = R.color.corFinalizada;
}
if (status.equals("E")) {
backgroundColor = R.color.corEncerrada;
}
if (status.equals("N")) {
backgroundColor = R.color.corNova;
}
String dataInc = item.getDataInclusao().replaceAll("[/]", "");
String dataBr = "";
if (!dataInc.trim().equals("")) {
String dia = dataInc.substring(4, 6);
String mes = dataInc.substring(6, 8);
String ano = dataInc.substring(0, 4);
dataBr = dia + "/" + mes + "/" + ano;
}
String horaInc = item.getHoraInclusao().trim();
dataBr += " " + horaInc;
viewHolder.campoCorStatus.setBackgroundResource(backgroundColor);
viewHolder.campoNomeCliente.setText(cliente == null ? "(cliente)" : cliente.getNome());
viewHolder.campoNomePaciente.setText(item.getNomePaciente());
viewHolder.campoNomeMedico.setText(medico == null ? "(médico)" : medico.getNome());
viewHolder.campoDataHoraInc.setText(dataBr + " (" + item.getId() + ")");
final Agendamento item1 = item;
viewHolder.chkMarcado.setOnCheckedChangeListener(null);
viewHolder.chkMarcado.setChecked(item.isSelected());
viewHolder.chkMarcado.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
selectedList.add(item1);
} else {
selectedList.remove(item1);
}
}
});
if (position % 2 == 0) {
convertView.setBackgroundResource(R.drawable.cor_zebra2);
} else {
convertView.setBackgroundResource(R.drawable.cor_zebra1);
}
// Return the completed view to render on screen
return convertView;
}
这是向上滚动前的结果,向上滚动后那些选中的复选框变为未选中:
ListView
的工作方式是循环使用不同数据填充的相同视图。因此,需要视图持有者模式,看起来您正在使用它。
因此,为了使您的列表正常工作,您需要将选中状态保存到支持数据模型中。看起来您的模型中可能已经有一个 "selected" 布尔值?如果是这样,你只需要将状态保存到这个布尔值。
viewHolder.chkMarcado.setChecked(item.isSelected());
viewHolder.chkMarcado.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
item.setSelected(isChecked);
}
});