RadioGroup在自定义列表视图

时间:2017-07-22 18:05:23

标签: android listview android-recyclerview

问题是,当我在第一行中选择第一个选项时,第六行的第一个选项也会被选中,当我在第六行选择选项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>

1 个答案:

答案 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;
    }

}
相关问题