滚动

时间:2016-02-09 15:48:14

标签: android listview android-viewholder

好的,我现在放弃了,请帮助我们。

我看到网上充满了像我一样的问题。 但他们都没有帮助我,因为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;
}

2 个答案:

答案 0 :(得分:0)

首先,取消设置来自RadioGroup的OnCheckedChangeListener。然后设置每个按钮的检查状态。最后在最后注册一个新的OnCheckedChangeListener。

我猜测,当您在组上设置侦听器后设置项目的检查状态时,每次都会调用侦听器。

答案 1 :(得分:0)

最后 - 唯一有用的东西 - 我放弃了ViewHolder。 我修改了我的活动,列表中包含的不是几百个但只有10-20行,如果没有ViewHolder,滚动的行数很少。 如果我使用它那那就是bug。