1. 程式人生 > >Android開發:在ListView中使用RadioGroup時出現混亂選中現象

Android開發:在ListView中使用RadioGroup時出現混亂選中現象

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