现在的位置: 首页 > 综合 > 正文

Android开发:在ListView中使用RadioGroup时出现混乱选中现象

2018年02月16日 ⁄ 综合 ⁄ 共 2895字 ⁄ 字号 评论关闭

重写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也显示被选中。

解决二:因为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;
	}

抱歉!评论已关闭.