重写Adapter的getView方法();
设置每个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也显示被选中。
以,应该在 解决一 操作之前取消其监听,就能达到想要的效果。
图片:
修改后代码如下:
@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);
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;
}