Настраиваемая строка с тремя переключателями в настраиваемом ListView

У меня есть настраиваемая строка с 3 переключателями.

Если я проверяю какой-либо радиокнопку и после этого прокручиваю, мой список теряет ссылку на радиокнопки, и когда я возвращаюсь, радиокнопка не проверяется. ИЛИ, когда я прокручиваю, последний радиокнопка проверяется (но я не нажимал радиокнопку в этой строке)

Вот код

ПЕРЕХОДНИК


public View getView(int position, View row, ViewGroup parent) {

        Holder holder;
        if (row == null) {
            holder = new Holder();
            row = LayoutInflater.from(activity).inflate(R.layout.linha_ficha,parent,false);
            holder.tv_linhaFicha_NumItem = (TextView) row.findViewById(R.id.tv_linhaFicha_NumItem);
            holder.tv_linhaFicha_Pergunta = (TextView) row.findViewById(R.id.tv_linhaFicha_Pergunta);
            holder.tv_linhaFicha_Tolerancia = (TextView) row.findViewById(R.id.tv_linhaFicha_Tolerancia);
            holder.tv_linhaFicha_DataAprovado = (TextView) row.findViewById(R.id.tv_linhaFicha_DataAprovado);
            holder.tv_linhaFicha_DataReprovado = (TextView) row.findViewById(R.id.tv_linhaFicha_DataReprovado);
            holder.tv_linhaFicha_Responsavel = (TextView) row.findViewById(R.id.tv_linhaFicha_Responsavel);
            holder.rb_linhaFicha_O = (RadioButton) row.findViewById(R.id.rb_linhaFicha_O);
            holder.rb_linhaFicha_O.setOnClickListener(this);
            holder.rb_linhaFicha_O.setOnCheckedChangeListener(this);
            holder.rb_linhaFicha_X = (RadioButton) row.findViewById(R.id.rb_linhaFicha_X);
            holder.rb_linhaFicha_X.setOnCheckedChangeListener(this);
            holder.rb_linhaFicha_Reinspecao = (RadioButton) row.findViewById(R.id.rb_linhaFicha_Reinspecao);
            holder.rb_linhaFicha_Reinspecao.setOnClickListener(this);
            holder.rb_linhaFicha_Reinspecao.setOnCheckedChangeListener(this);
            row.setTag(holder);
        } else {
            holder = (Holder) row.getTag();
        }

        itensCondicoes = (Fvs_ItemCondicao) getItem(position);

        holder.tv_linhaFicha_NumItem.setText(itensCondicoes.getNumItem());
        holder.tv_linhaFicha_Pergunta.setText(itensCondicoes.getNome());
        holder.tv_linhaFicha_Tolerancia.setText(itensCondicoes.getTolerancia());
        holder.tv_linhaFicha_DataAprovado.setText(itensCondicoes.getDataAprovado());
        holder.tv_linhaFicha_DataReprovado.setText(itensCondicoes.getDataReprovado());
        holder.tv_linhaFicha_Responsavel.setText(itensCondicoes.getNomeUsuario());

        if (itensCondicoes.getResposta().length() > 0) {
            if (itensCondicoes.getResposta().equals("o")) {
                holder.rb_linhaFicha_X.setButtonDrawable(R.drawable.bt_x);
                holder.rb_linhaFicha_O.setButtonDrawable(R.drawable.bt_o_atv);
                holder.rb_linhaFicha_Reinspecao.setButtonDrawable(R.drawable.bt_reinspecao_inativo);
                setEnabledCheck(holder,false,true,false);
            }

            if (itensCondicoes.getResposta().equals("x")) {
                holder.rb_linhaFicha_X.setButtonDrawable(R.drawable.bt_x_atv);
                holder.rb_linhaFicha_O.setButtonDrawable(R.drawable.bt_o);
                holder.rb_linhaFicha_Reinspecao.setButtonDrawable(R.drawable.bt_reinspecao_inativo);
                setEnabledCheck(holder,false,false,false);
            }

            if (itensCondicoes.getResposta().equals("ox")) {
                holder.rb_linhaFicha_X.setButtonDrawable(R.drawable.bt_x);
                holder.rb_linhaFicha_O.setButtonDrawable(R.drawable.bt_o);
                holder.rb_linhaFicha_Reinspecao.setButtonDrawable(R.drawable.bt_reinspecao_ativo);
                setEnabledCheck(holder,false,false,true);
            }
        } else {
            setEnabledCheck(holder, true, true, false);
        }

        holder.itensCondicoes = itensCondicoes;

        return row;
    }

OnCheckedChanged


public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        Holder tempHolder = ((Holder)((View)buttonView.getParent().getParent()).getTag());

        if (tempHolder != null) {
            if (buttonView.getId() == R.id.rb_linhaFicha_X) {
                if (tempHolder.getItensCondicoes().getStatus() == 1) {
                    if (isChecked) {
                        tempHolder.rb_linhaFicha_X.setButtonDrawable(R.drawable.bt_x_atv);
                        setConformidadeRegras(tempHolder);
                    } else {
                        tempHolder.rb_linhaFicha_X.setButtonDrawable(R.drawable.bt_x);
                    }
                }
            }

            if (buttonView.getId() == R.id.rb_linhaFicha_O) {
                if (tempHolder.getItensCondicoes().getStatus() == 1) {
                    if (isChecked) {
                        tempHolder.rb_linhaFicha_O.setButtonDrawable(R.drawable.bt_o_atv);
                        setNaoConformidadeRegras(tempHolder);
                    } else {
                        tempHolder.rb_linhaFicha_O.setButtonDrawable(R.drawable.bt_o);
                    }
                }
            }
        }
    }

А вот и настраиваемая строка

RadioButtons X, O и OX неактивны, когда кнопка синего цвета активна


person groff07    schedule 07.08.2014    source источник


Ответы (2)


Это потому, что адаптер повторно использует представления. Вы можете либо отключить эту функцию (настоятельно не рекомендуется), либо сохранить состояния флажков для каждого элемента списка.

Сначала я бы посоветовал вам создать собственный класс для хранения трех состояний для одного элемента:

public class CheckboxStates {
    boolean check1, check2, check3;

    CheckboxStates(boolean b1, boolean b2, boolean b3) {
        check1 = b1;
        check2 = b2;
        check3 = b3;
    }
}

List<CheckboxStates> checkboxStates = new ArrayList<CheckboxStates>();

Теперь, когда у вас есть количество элементов ListView (возможно, в конструкторе адаптеров), вы можете инициализировать состояния как [false, false, false] (если это значение по умолчанию).

for (int i=0; i<itemCount; i++) {
    checkboxStates.add(new CheckboxStates(false, false, false));
}

Наконец, вы готовы читать / устанавливать значения в вашем getView():

// Get states for this list item
CheckboxStates states = checkboxStates.get(position);

// Get/set the values
states.check1 = false;
states.check2 = true;
states.check3 = false;
person Simas    schedule 07.08.2014

Вам необходимо сохранить состояние флажков, поскольку представления будут повторно использоваться, и вы не можете полагаться на неявное состояние, сохраненное в переключателях.

Добавьте это в класс, возвращаемый getItem, и, щелкнув радиокнопку, сохраните состояние в этом классе.

person Vinayak Bhavnani    schedule 07.08.2014