Android - ListView с кнопкой радио

У меня есть ListView, связанный с пользовательским классом ArrayAdapter, где каждая строка содержит TextView и RadioGroup, состоящую из 3 RadioButton. Я использую шаблон ViewHolder для переработки видов внутри ListView.
Я написал RadioGroup.setOnCheckedChangeListener для захвата события RadioButton "OnCheckedChange". Внутри обработчик событий. Я отслеживаю состояние радиокнопок, используя мой класс Model.
Однако у меня возникла проблема с установкой проверки для переключателей с использованием шаблона держателя внутри метода GetView() Adapters. Ниже приведен код класса моего адаптера.

    public class QuestionsAdapter extends ArrayAdapter<QuestionAudit>{
Context context;
private List<QuestionAudit> questions;

public QuestionsAdapter(Context context, int resourceId, List<QuestionAudit> questions){
    super(context,resourceId,questions);
    this.context = context;
    this.questions = questions;
}

/*private view holder class*/
private class ViewHolder {
    TextView tv_question;
    RadioGroup rg_answer_options;
    RadioButton rb_answer_yes;
    RadioButton rb_answer_no;
    RadioButton rb_answer_na;

}

@Override
public int getCount() {
    return questions.size();
}

@Override
public QuestionAudit getItem(int position) {
    return questions.get(position);
}

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

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    View rowView = convertView;
    QuestionAudit question = (QuestionAudit) getItem(position);

    if (rowView == null) {
        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        rowView = mInflater.inflate(R.layout.list_item_patrol_question, null);
        holder = new ViewHolder();
        holder.tv_question = (TextView) rowView.findViewById(R.id.tv_question);

        holder.rg_answer_options = (RadioGroup) rowView.findViewById(R.id.rg_answer_options);

        holder.rb_answer_yes = (RadioButton) rowView.findViewById(R.id.rb_answer_yes);
        holder.rb_answer_no = (RadioButton) rowView.findViewById(R.id.rb_answer_no);
        holder.rb_answer_na = (RadioButton) rowView.findViewById(R.id.rb_answer_na);

        rowView.setTag(holder);

    } else {
        holder = (ViewHolder) rowView.getTag();

    }

    holder.tv_question.setText(question.getQuestion());

    holder.rg_answer_options.setTag(position);

    //set onClickListener
    holder.rg_answer_options.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
            //Integer position = (Integer) radioGroup.getTag();

            switch (checkedId) {
                case R.id.rb_answer_yes:
                    questions.get(position).setIsAnswerYes(true);
                    CommonHelperFuncs.displayToast(getContext(), "position: " + Integer.valueOf(position) + "  yes");
                    break;
                case R.id.rb_answer_no:
                    questions.get(position).setIsAnswerNo(true);
                    CommonHelperFuncs.displayToast(getContext(), "position: " + Integer.valueOf(position) + "  no");
                    break;
                case R.id.rb_answer_na:
                    questions.get(position).setIsAnswerNa(true);
                    CommonHelperFuncs.displayToast(getContext(), "position: " + Integer.valueOf(position) + "  na");
                    break;
            }
        }
    });

    if(question.getIsAnswerYes())
        holder.rb_answer_yes.setChecked(true);
    else
        holder.rb_answer_yes.setChecked(false);

    if(question.getIsAnswerNo())
        holder.rb_answer_no.setChecked(true);
    else
        holder.rb_answer_no.setChecked(false);

    if(question.getIsAnswerNa())
        holder.rb_answer_na.setChecked(true);
    else
        holder.rb_answer_na.setChecked(false);
    return rowView;
}

}

Просто чтобы быть уверенным в остальной части моего кода, я попытался протестировать без использования шаблона ViewHolder внутри GetView(), и он работает просто отлично.
Я провел свое исследование и увидел, что многие люди сталкиваются с такими же проблемами с RadioButtons внутри представления списка при использовании с ViewHolder. Я не мог заставить свой код работать ни от одного из упомянутых решений.
Любая помощь в этом приветствуется. Спасибо.

1 ответ

Попробуй это:

        // clear the listener while you're checking radio buttons
        holder.rg_answer_options.setOnCheckedChangeListener(null);

        if (question.getIsAnswerYes()) {
            holder.rg_answer_options.check(R.id.rb_answer_yes);
        } else if (question.getIsAnswerNo()) {
            holder.rg_answer_options.check(R.id.rb_answer_no);
        } else if (question.getIsAnswerNa()) {
            holder.rg_answer_options.check(R.id.rb_answer_na);
        } else {
            holder.rg_answer_options.clearCheck();
        }

        // now set your listener
        holder.rg_answer_options.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                .
                .
                .
Другие вопросы по тегам