好的,我现在放弃了,请帮助我们。
我看到网上充满了像我一样的问题。 但他们都没有帮助我,因为90%的问题都是一个简单的错误,例如将设置方法放入if语句。
我想我知道基本知识,不做简单的错误,但仍然无法正常工作。
我有一个ListView,在每一行中我都有一个TextView和四个RadioButton。您可以在每行中设置其中一个。多数民众赞成。 我使用ViewHolder进行平滑滚动,因为列表中有几百行。 当你开始滚动时,它会拧紧一切:检查RB取消选中,反之亦然。
这个笑话是,这是(仅)一个视觉错误,因为当保存设置时,只有实际触摸的行处于检查状态,所以基本上它可以工作,但我不能告诉我的用户忽略你所看到的:)
我尝试了所有代码,错误在哪里?
public View getView(final int position, View convertView, ViewGroup parent) {
// i need a final modifier because I use the holder in Listener
final ViewHolder holder;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.hatranyos_lista_row, parent, false);
holder = new ViewHolder();
holder.nev = (TextView) convertView.findViewById(R.id.nev);
holder.rg = (RadioGroup) convertView.findViewById(R.id.radioTipus);
holder.rb_elit = (RadioButton) convertView.findViewById(R.id.radioElit);
holder.rb_atl = (RadioButton) convertView.findViewById(R.id.radioAtlagos);
holder.rb_atl_a = (RadioButton) convertView.findViewById(R.id.radioAtlagAlatt);
holder.rb_rossz = (RadioButton) convertView.findViewById(R.id.radioRossz);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// one listener for the RadioGroup. I think its okay, because when i remove it, my problem still exists
holder.rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (holder.rb_elit.isChecked()) {
values.get(position).setH_statusz(1);
}
if (holder.rb_atl.isChecked()) {
values.get(position).setH_statusz(2);
}
if (holder.rb_atl_a.isChecked()) {
values.get(position).setH_statusz(3);
}
if (holder.rb_rossz.isChecked()) {
values.get(position).setH_statusz(4);
}
}
});
// setters after the if statement
holder.nev.setText(values.get(position).getUtvonal() + "/" + values.get(position).getPos() + " " + values.get(position).getNev());
int h_statusz = values.get(position).getH_statusz();
// and finally (pre)setting the RBs. I know rows will recycle so I tried to set in every case
switch (h_statusz) {
case 1:
holder.rb_elit.setChecked(true);
holder.rb_atl.setChecked(false);
holder.rb_atl_a.setChecked(false);
holder.rb_rossz.setChecked(false);
break;
case 2:
holder.rb_elit.setChecked(false);
holder.rb_atl.setChecked(true);
holder.rb_atl_a.setChecked(false);
holder.rb_rossz.setChecked(false);
break;
case 3:
holder.rb_elit.setChecked(false);
holder.rb_atl.setChecked(false);
holder.rb_atl_a.setChecked(true);
holder.rb_rossz.setChecked(false);
break;
case 4:
holder.rb_elit.setChecked(false);
holder.rb_atl.setChecked(false);
holder.rb_atl_a.setChecked(false);
holder.rb_rossz.setChecked(true);
break;
default:
holder.rb_elit.setChecked(false);
holder.rb_atl.setChecked(false);
holder.rb_atl_a.setChecked(false);
holder.rb_rossz.setChecked(false);
break;
}
return convertView;
}
static class ViewHolder {
TextView nev;
RadioGroup rg;
RadioButton rb_elit;
RadioButton rb_atl;
RadioButton rb_atl_a;
RadioButton rb_rossz;
}
答案 0 :(得分:0)
首先,取消设置来自RadioGroup的OnCheckedChangeListener。然后设置每个按钮的检查状态。最后在最后注册一个新的OnCheckedChangeListener。
我猜测,当您在组上设置侦听器后设置项目的检查状态时,每次都会调用侦听器。
答案 1 :(得分:0)
最后 - 唯一有用的东西 - 我放弃了ViewHolder。 我修改了我的活动,列表中包含的不是几百个但只有10-20行,如果没有ViewHolder,滚动的行数很少。 如果我使用它那那就是bug。