0

The problem is when i choose first option in first row the first option on the sixth row also get selected and when i choose option 2 on the sixth row the first row option also changes to option 2 i know the problem is with recycle view is there any way to solve this? it works like a question paper once the user choose an answer he cant change that answer i was trying through setting variable via datamodel class but it also not working

CustomAdapter file

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 file

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>
chriscka
  • 157
  • 3
  • 12
  • U can use a sparbseboolean array to keep the record of the selected values or you can create a boolean field in your model and keep the record inside the model then in your getview method you need to check which one is selected according to that you need to setChecked and setUnCheck. – Reyansh Mishra Jul 22 '17 at 18:10
  • Could you please explain with a example code? is that with setOnCheckedChangeListener()? – chriscka Jul 22 '17 at 18:20
  • Here something like this https://stackoverflow.com/a/40551984/5492047 – Reyansh Mishra Jul 22 '17 at 18:43

1 Answers1

1

You can use SparseIntArray to save selected radio button id's for each item. Try this:

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

}
Fatih Santalu
  • 4,641
  • 2
  • 17
  • 34