2016-07-27 55 views
0

我有绑定到一个自定义一个ArrayAdapter类与含有一个TextView和组成3个单选按钮一个RadioGroup中每行一个ListView。我正在使用ViewHolder模式来回收ListView中的视图。
我已经写了RadioGroup.setOnCheckedChangeListener捕捉单选按钮“OnCheckedChange”事件。在事件处理程序中。我正在使用我的Model类跟踪我的单选按钮的状态。
不过,我有,可以通过使用适配器GetView内支架模式单选按钮支票签发()method.Below是我的适配器类代码 -的Android - ListView的与无线电按钮

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; 
} 

}

只是要关于我的代码的其余部分,我试着在GetView()内部使用ViewHolder模式进行测试,它工作得很好。
我做我的研究,看到了很多与ViewHolder使用当具有相同类型的问题与列表视图中单选按钮的乡亲。我无法让我的代码从任何上述解决方案中工作。
任何帮助是appreciated.Thanks。

+0

@kris拉尔森 - 惊人的。这解决了我的问题。我明白了,在正确的位置设置“setOnCheckedChangeListener”为空就行了。再次感谢。并且相信我,我尝试了upvote,但是它只是被记录下来,并且由于“低声誉”而没有公开显示:)。 –

回答

0

试试这个:

 // 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() { 
       . 
       . 
       .