Android開發:在ListView中使用RadioGroup時出現混亂選中現象
阿新 • • 發佈:2019-01-29
重寫Adapter的getView方法();
再次出現錯誤:以選中的radiobutton會被其他為選中的item中的對應radiobutton模仿,假如第一行選擇A,滑動後,第七行的對應A的radiobutton也顯示被選中。
設定每個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; }