我遇到了一个常见的问题,但是我无法看到它的解决方案。 我想要实现的是显示问题列表(它们来自解析的JSON)和每个下面的radioGroup。
我设法显示问题列表。现在当我检查按钮并向下滚动列表时,上面的按钮正在松开状态。我已经关注并阅读了关于getView()并尝试了不同的方法:
在这里:
stackoverflow.com...android-how-to-make-radiogroup-work-correctly-in-a-listview
我在ArrayAdapter中使用HashMap。我试图将这些'转换'为对象数组,但没有成功。我不知道如何让每个按钮保持状态。
你能指出我做错了什么或我错过了什么吗?
我已经包含了arrayAdater的代码和我的xml可视布局的模型。
public class QuestionListAdapter extends ArrayAdapter<HashMap<String, Object>> {
PlayerData plData = new PlayerData();
public int current = NONE;
public static final int NONE = 1000;
public static String id;
private Activity _activity;
private ArrayList<HashMap<String, Object>> _questionsList;
private HashMap<String, Object> answers;
public QuestionListAdapter(Activity activity, int resource,
ArrayList<HashMap<String, Object>> questionsList) {
super(activity, resource, questionsList);
_activity = activity;
_questionsList = questionsList;
}
public static final class ViewHolder {
TextView question;
RadioGroup radioG;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
ViewHolder holder = null;
if (view == null) {
LayoutInflater layoutInflater = (LayoutInflater) _activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(R.layout.question_right_fragment,
null);
holder = new ViewHolder();
holder.question = (TextView) view.findViewById(R.id.question);
holder.radioG = (RadioGroup) view.findViewById(R.id.radio0);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
final HashMap<String, Object> pData = _questionsList.get(position);
if (pData != null) {
holder.question.setText((String) pData.get("questionText"));
// holder.radioG.clearCheck();
holder.radioG
.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group,
int checkedId) {
Integer pos = (Integer) group.getTag();
switch (checkedId) {
case R.id.radio1:
plData.setQ1((byte) 1);
break;
case R.id.radio2:
plData.setQ2((byte) 2);
break;
case R.id.radio3:
plData.setQ3((byte) 3);
break;
case R.id.radio4:
plData.setQ4((byte) 4);
break;
case R.id.radio5:
plData.setQ5((byte) 5);
break;
case R.id.radio6:
plData.setQ6((byte) 6);
break;
case R.id.radio7:
plData.setQ1((byte) 7);
break;
default:
}
Log.d("IN PLDATA:", plData.toString());
answers.put("id", plData);
}
});
} else {
holder = (ViewHolder) view.getTag();
}
holder.radioG.setTag(new Integer(position));
if (_questionsList.get(position).get(
holder.radioG.getCheckedRadioButtonId()) != null) {
RadioButton r = (RadioButton) holder.radioG
.getChildAt((Integer) _questionsList.get(position).get(
holder.radioG.getCheckedRadioButtonId()));
r.setChecked(true);
} else {
holder.radioG.clearCheck();
}
return view;
}
}
答案 0 :(得分:4)
供将来参考。使用SparseIntArray。在我的情况下,我打电话给它。
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
LayoutInflater mInflater = (LayoutInflater) _activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.question_right_fragment, null);
holder = new ViewHolder();
holder.question = (TextView) convertView.findViewById(R.id.question);
holder.radioG = (RadioGroup) convertView.findViewById(R.id.radio0);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final HashMap<String, Object> pData = _questionsList.get(position);
if (pData != null){
holder.question.setText((String)pData.get("questionText"));
}else{
holder.question.setText("");
}
holder.radioG.setOnCheckedChangeListener(null);
holder.radioG.clearCheck();
if(checked.indexOfKey(position)>-1){
holder.radioG.check(checked.get(position));
}else{
holder.radioG.clearCheck();
}
holder.radioG.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if(checkedId>-1){
checked.put(position, checkedId);
}else{
if(checked.indexOfKey(position)>-1)
checked.removeAt(checked.indexOfKey(position));
}
}
});
return convertView;
}