问题是,当我在第一行中选择第一个选项时,第六行的第一个选项也会被选中,当我在第六行选择选项2时,第一行选项也会更改为选项2我知道问题在于回收view有什么方法可以解决这个问题?一旦用户选择了答案,它就像一个试卷一样,他无法改变我通过datamodel类设置变量的答案,但它也无法正常工作
CustomAdapter文件
public class CustomAdapter extends ArrayAdapter<DataModel> {
private ArrayList<DataModel> dataSet;
Context mContext;
// View lookup cache
private static class ViewHolder {
TextView txtName;
RadioButton opt1;
RadioButton opt2;
RadioButton opt3;
RadioButton opt4;
RadioGroup rg;
ImageView info;
}
public CustomAdapter(ArrayList<DataModel> data, Context context) {
super(context, R.layout.row_item, data);
this.dataSet = data;
this.mContext = context;
}
private int lastPosition = -1;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Get the data item for this position
final DataModel dataModel = getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
final ViewHolder viewHolder; // view lookup cache stored in tag
final View result;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.row_item, parent, false);
viewHolder.txtName = (TextView) convertView.findViewById(R.id.question);
viewHolder.opt1=(RadioButton)convertView.findViewById(R.id.option1);
viewHolder.opt2=(RadioButton)convertView.findViewById(R.id.option2);
viewHolder.opt3=(RadioButton)convertView.findViewById(R.id.option3);
viewHolder.opt4=(RadioButton)convertView.findViewById(R.id.option4);
viewHolder.rg=(RadioGroup)convertView.findViewById(R.id.rgb) ;
viewHolder.rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, @IdRes int i) {
Log.e("val",String.valueOf(i));
dataModel.setChosen(String.valueOf(i));
}
});
result = convertView;
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
result = convertView;
}
Animation animation = AnimationUtils.loadAnimation(mContext, (position > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top);
result.startAnimation(animation);
lastPosition = position;
viewHolder.txtName.setText(dataModel.getQuestion());
viewHolder.opt1.setText(dataModel.getOption1());
viewHolder.opt2.setText(dataModel.getOption2());
viewHolder.opt3.setText(dataModel.getOption3());
viewHolder.opt4.setText(dataModel.getOption4());
// Return the completed view to render on screen
return convertView;
}
}
DataModel文件
public class DataModel {
String question;
String option1;
String option2;
String option3;
String option4;
String chosen;
public DataModel(String question, String option1, String option2, String option3,String option4 ) {
this.question=question;
this.option1=option1;
this.option2=option2;
this.option3=option3;
this.option4=option4;
}
public void setChosen(String ch)
{
this.chosen=ch;
}
public String getQuestion() {
return question;
}
public String getOption1() {
return option1;
}
public String getOption2() {
return option2;
}
public String getOption3() {
return option3;
}
public String getOption4() {
return option4;
}
public String getchosen()
{
return chosen;
}
}
row_item.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:id="@+id/question"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="Question"
android:textColor="@android:color/black" />
<RadioGroup xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rgb"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:weightSum="1"
android:layout_below="@+id/question"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
<RadioButton
android:id="@+id/option1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/question"
android:layout_marginEnd="20dp"
android:layout_marginRight="20dp"
android:text="Option1" />
<RadioButton
android:id="@+id/option2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/question"
android:layout_marginEnd="20dp"
android:layout_marginRight="20dp"
android:text="Option2" />
<RadioButton
android:id="@+id/option3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/question"
android:layout_marginEnd="20dp"
android:layout_marginRight="20dp"
android:text="Option3" />
<RadioButton
android:id="@+id/option4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/question"
android:layout_marginEnd="20dp"
android:layout_marginRight="20dp"
android:text="Option4" />
</RadioGroup>
</RelativeLayout>
答案 0 :(得分:1)
您可以使用SparseIntArray为每个项目保存所选的单选按钮ID。试试这个:
public class CustomAdapter extends ArrayAdapter<DataModel> {
private ArrayList<DataModel> dataSet;
private SparseIntArray mSelections;
Context mContext;
// View lookup cache
private static class ViewHolder {
TextView txtName;
RadioButton opt1;
RadioButton opt2;
RadioButton opt3;
RadioButton opt4;
RadioGroup rg;
ImageView info;
}
public CustomAdapter(ArrayList<DataModel> data, Context context) {
super(context, R.layout.row_item, data);
this.dataSet = data;
this.mContext = context;
mSelections = new SparseIntArray();
}
private int lastPosition = -1;
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// Get the data item for this position
final DataModel dataModel = getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
final ViewHolder viewHolder; // view lookup cache stored in tag
final View result;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.row_item, parent, false);
viewHolder.txtName = (TextView) convertView.findViewById(R.id.question);
viewHolder.opt1 = (RadioButton) convertView.findViewById(R.id.option1);
viewHolder.opt2 = (RadioButton) convertView.findViewById(R.id.option2);
viewHolder.opt3 = (RadioButton) convertView.findViewById(R.id.option3);
viewHolder.opt4 = (RadioButton) convertView.findViewById(R.id.option4);
viewHolder.rg = (RadioGroup) convertView.findViewById(R.id.rgb);
result = convertView;
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
result = convertView;
}
viewHolder.rg.setOnCheckedChangeListener(null);
viewHolder.rg.clearCheck();
if(mSelections.get(position) > -1) {
viewHolder.rg.check(mSelections.get(position));
}
viewHolder.rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, @IdRes int i) {
Log.e("val", "position: " + position + "checked " + radioGroup.getCheckedRadioButtonId());
mSelections.put(position, radioGroup.getCheckedRadioButtonId());
notifyDataSetChanged();
}
});
/*Animation animation = AnimationUtils.loadAnimation(mContext, (position > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top);
result.startAnimation(animation);*/
lastPosition = position;
viewHolder.txtName.setText(dataModel.getQuestion());
viewHolder.opt1.setText(dataModel.getOption1());
viewHolder.opt2.setText(dataModel.getOption2());
viewHolder.opt3.setText(dataModel.getOption3());
viewHolder.opt4.setText(dataModel.getOption4());
// Return the completed view to render on screen
return convertView;
}
}