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

本文介绍了解决RecyclerView中RadioGroup状态混乱的问题。通过在重用视图时清除监听并根据数据设置RadioGroup的状态,避免了滑动时未选中的选项被误选的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


重写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);
		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;
	}

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值