设置每个item中RadioGroup的监听器(viewHolder.answerRg.setOnCheckedChangeListener()),每RadioGroup中有四个radiobutton表示A,B,C,D。
错误: 在调试时,假如第一个item中的radiobutton是被选中的,则在来回滑动屏幕时,其他item中原本没有选中的radiobutton也会被混乱选中。
解决一:根据数据在每次复用时设置其check状态,如果对应此item的Answer为空,则viewHolder.answerRg.clearCheck();
如果不为空,则check(对应的radiobutton);
再次出现错误:以选中的radiobutton会被其他为选中的item中的对应radiobutton模仿,假如第一行选择A,滑动后,第七行的对应A的radiobutton也显示被选中。
解决二:因为viewHolder.answerRg.setOnCheckedChangeListener()的存在,解决一 的操作都会被监听到,从而使没有数据的item也获得数据,所
以,应该在 解决一 操作之前取消其监听,就能达到想要的效果。
修改后代码如下:
@Override public View getView(int position, View convertView, ViewGroup parent) { ExamItem item = (ExamItem) getItem(position); LogUtils.info(TAG, "getView: " + position + "; view=" + convertView + "; " + item + "; " + item.toMyString()); ViewHolder viewHolder = null; if (convertView == null) { convertView = mInflater.inflate(R.layout.paper_listiew_item, null); viewHolder = new ViewHolder(); viewHolder.idTv = (TextView) convertView.findViewById(R.id.item_number_tv); viewHolder.answerRg = (RadioGroup) convertView.findViewById(R.id.item_radio_group); viewHolder.answerRgA = (RadioButton) convertView.findViewById(R.id.radio_btn_a); viewHolder.answerRgB = (RadioButton) convertView.findViewById(R.id.radio_btn_b); viewHolder.answerRgC = (RadioButton) convertView.findViewById(R.id.radio_btn_c); viewHolder.answerRgD = (RadioButton) convertView.findViewById(R.id.radio_btn_d); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.idTv.setText(item.getLabel()); viewHolder.answerRg.setId(position);
//取消其监听
viewHolder.answerRg.setOnCheckedChangeListener(null);
//设置每个item中RadioGroup的监听器(viewHolder.answerRg.setOnCheckedChangeListener()),每RadioGroup中有四个radiobutton表示A,B,C,D。
if (!TextUtils.isEmpty(item.getAnswer()))
{
if (item.getAnswer().equals("A"))
{
viewHolder.answerRg.check(R.id.radio_btn_a);
}
else if (item.getAnswer().equals("B"))
{
viewHolder.answerRg.check(R.id.radio_btn_b);
else if (item.getAnswer().equals("C"))
{
viewHolder.answerRg.check(R.id.radio_btn_c);
}
else if (item.getAnswer().equals("D"))
{
viewHolder.answerRg.check(R.id.radio_btn_d);
}
else
{
viewHolder.answerRg.clearCheck();
}
}
else
{
viewHolder.answerRg.clearCheck();
}
viewHolder.answerRg.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(RadioGroup group, int checkedId)
{
LogUtils.info(TAG,"onCheckedChanged: groupId=" + group.getId()+ ";checkedId=" + checkedId);
ExamItem item = mList.get(group.getId());
if (item == null) return;
LogUtils.info(TAG, "onCheckedChanged: item=" + item+ ";
switch (checkedId)
{
case R.id.radio_btn_a:
{
item.setAnswer("A");
break;
}
case R.id.radio_btn_b:
{
item.setAnswer("B");
break;
}
case R.id.radio_btn_c:
}
item.setAnswer("C");
break;
}
case R.id.radio_btn_d:
{
item.setAnswer("D");
break;
}
}
LogUtils.info(TAG, "onCheckedChanged: item=" + item+ "; \\\\" + item.toMyString());
}
});
return convertView;
}
class ViewHolder
{
TextView idTv;
RadioGroup answerRg;
RadioButton answerRgA;
RadioButton answerRgB;
RadioButton answerRgC;
RadioButton answerRgD;
}