user3024990
user3024990

Reputation: 61

Android radio group inside listview not working properly

I'm new to android and trying to create a listview of questions, of 2 types, mcq and true-false, along with a question textview and a submit button there is a radio group with 4 radio buttons, depending upon the type of question, i'm hiding 2 radio buttons and making it look like true-false question, everything till here is working fine...

Problem arise when i check any radio button and scroll down or up, that button does not retain its state, even after storing which option was selected, if stored option is found checked i check the radio button,but it does not show checked in UI, rather show checked in some other question or sometime different radio button is checked..

here is my adapter code

public class QuestionAdapter extends BaseAdapter
{

    private ArrayList<QuestionsGetSet> data;
    private Context acontext;
    private LayoutInflater inflater;
    private String TAG="QuestionAdapter";

    public QuestionAdapter(Context a, ArrayList<QuestionsGetSet> q)
    {
        acontext = a;
        data = q;
    }

    @Override
    public int getCount()
    {
        return data.size();
    }

    @Override
    public Object getItem(int arg0)
    {
        return data.get(arg0);
    }

    @Override
    public long getItemId(int arg0)
    {
        return 0;
    }

    @Override
    public View getView(int arg0, View arg1, ViewGroup arg2)
    {
        holder hv=null;
        final int postion = arg0;
        if (arg1 == null)
        {
            inflater = (LayoutInflater) acontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            arg1 = inflater.inflate(R.layout.question_feed, null);

            hv = new holder();
            hv.question = (TextView) arg1.findViewById(R.id.question_content_tv);
            hv.answer = (TextView) arg1.findViewById(R.id.question_answer_tv);
            hv.id = (TextView) arg1.findViewById(R.id.question_id_tv);
            hv.counter = (TextView) arg1.findViewById(R.id.question_counter_tv);
            hv.r_goup = (RadioGroup) arg1.findViewById(R.id.question_radio_group);
            hv.option1 = (RadioButton) arg1.findViewById(R.id.question_option_1);
            hv.option2 = (RadioButton) arg1.findViewById(R.id.question_option_2);
            hv.option3 = (RadioButton) arg1.findViewById(R.id.question_option_3);
            hv.option4 = (RadioButton) arg1.findViewById(R.id.question_option_4);
            hv.submit_btn = (Button) arg1.findViewById(R.id.question_submit_btn);
            hv.r_goup.setOnCheckedChangeListener(new OnCheckedChangeListener()
            {

                @Override
                public void onCheckedChanged(RadioGroup arg0, int arg1)
                {
                    Log.d(TAG,"inside oncheckedchanged, position="+postion);
                    data.get(postion).set_ischecked(true);
                    switch (arg1)
                    {
                    case R.id.question_option_1:
                        Log.d(TAG,"Option 1 checked");
                        data.get(postion).set_whichISchecked(1);
                        break;
                    case R.id.question_option_2:
                        Log.d(TAG,"Option 2 checked");
                        data.get(postion).set_whichISchecked(2);
                        break;
                    case R.id.question_option_3:
                        Log.d(TAG,"Option 3 checked");
                        data.get(postion).set_whichISchecked(3);
                        break;
                    case R.id.question_option_4:
                        Log.d(TAG,"Option 4 checked");
                        data.get(postion).set_whichISchecked(4);
                        break;
                    }
                }
            });
            arg1.setTag(hv);
        }
        else
        {
            hv = (holder) arg1.getTag();
        }

        QuestionsGetSet qgs = data.get(postion);
        if(qgs.get_ischecked())
        {
            Log.d(TAG,"inside if of is checked");
            int i=qgs.get_whichISchecked();
            Log.d(TAG,"inside if of is checked, which is check="+i);
            switch(i)
            {
            case 1:
                hv.option1.setChecked(true);
                hv.option2.setChecked(false);
                hv.option3.setChecked(false);
                hv.option4.setChecked(false);
                break;
            case 2:
                hv.option2.setChecked(true);
                hv.option1.setChecked(false);
                hv.option3.setChecked(false);
                hv.option4.setChecked(false);
                break;
            case 3:
                hv.option3.setChecked(true);
                hv.option1.setChecked(false);
                hv.option2.setChecked(false);
                hv.option4.setChecked(false);
                break;
            case 4:
                hv.option4.setChecked(true);
                hv.option1.setChecked(false);
                hv.option2.setChecked(false);
                hv.option3.setChecked(false);
                break;
            }
        }
        else if(!qgs.get_ischecked())
        {
            Log.d(TAG,"inside else of is checked");
            hv.option1.setChecked(false);
            hv.option2.setChecked(false);
            hv.option3.setChecked(false);
            hv.option4.setChecked(false);
        }


        /*** below all code is working fine  ***/

        /// used to create a true-false or mcq type ui, working fine
        if (qgs.get_isBool())
        {
            hv.option1.setText("True");
            hv.option2.setText("False");
            hv.option3.setVisibility(View.GONE);
            hv.option4.setVisibility(View.GONE);
        } else
        {
            hv.option1.setText(qgs.get_option_1());
            hv.option2.setText(qgs.get_option_2());
            hv.option3.setVisibility(View.VISIBLE);
            hv.option4.setVisibility(View.VISIBLE);
            hv.option3.setText(qgs.get_option_3());
            hv.option4.setText(qgs.get_option_4());
        }
        /// used to check if question can be submitted or not, working fine
        if (qgs.get_isvalid() != null)
        {
            if (!qgs.get_isvalid())
            {
                hv.submit_btn.setText("Question Closed");
                hv.submit_btn.setBackgroundResource(R.drawable.btn_invalid);
            } else
            {
                hv.submit_btn.setText("Submit");
                hv.submit_btn.setBackgroundResource(R.drawable.btn_valid);
            }
        }
        /// used to check if answer is present, then showed to user, working fine
        if (qgs.get_answer() != null)
        {
            hv.answer.setVisibility(View.VISIBLE);
            hv.answer.setText(qgs.get_answer());
        } else
        {
            hv.answer.setVisibility(View.GONE);
            hv.answer.setText("");
        }
        hv.question.setText(qgs.get_question());
        hv.id.setText(qgs.get_id() + "");
        hv.counter.setText(qgs.get_counter() + "");

        return arg1;
    }

    class holder
    {
        TextView question, answer, id, counter;
        Button submit_btn;
        RadioGroup r_goup;
        RadioButton option1, option2, option3, option4;
    }
}

and here is QuestionGetSet code

public class QuestionsGetSet
{
    private String question,answer,option_1,option_2,option_3,option_4;
    private Boolean isBool=false,isvalid=false;
    private long id,counter;

    private Boolean isChecked=false;
    private int whichISchecked;

    public void set_ischecked(Boolean a)
    {
        this.isChecked=a;
    }
    public Boolean get_ischecked()
    {
        return this.isChecked;
    }
    public void set_whichISchecked(int a)
    {
        this.whichISchecked=a;
    }
    public int get_whichISchecked()
    {
        return this.whichISchecked;
    }


    public void set_question(String q)
    {
        this.question=q;
    }
    public String get_question()
    {
        return this.question;
    }
    public void set_answer(String q)
    {
        this.answer=q;
    }
    public String get_answer()
    {
        return this.answer;
    }
    public void set_option_1(String q)
    {
        this.option_1=q;
    }
    public String get_option_1()
    {
        return this.option_1;
    }
    public void set_option_2(String q)
    {
        this.option_2=q;
    }
    public String get_option_2()
    {
        return this.option_2;
    }
    public void set_option_3(String q)
    {
        this.option_3=q;
    }
    public String get_option_3()
    {
        return this.option_3;
    }
    public void set_option_4(String q)
    {
        this.option_4=q;
    }
    public String get_option_4()
    {
        return this.option_4;
    }

    public void set_isBool(Boolean q)
    {
        this.isBool=q;
    }
    public Boolean get_isBool()
    {
        return this.isBool;
    }
    public void set_isvalid(Boolean q)
    {
        this.isvalid=q;
    }
    public Boolean get_isvalid()
    {
        return this.isvalid;
    }

    public void set_id(long q)
    {
        this.id=q;
    }
    public long get_id()
    {
        return this.id;
    }
    public void set_counter(long q)
    {
        this.counter=q;
    }
    public long get_counter()
    {
        return this.counter;
    }
}

Upvotes: 1

Views: 314

Answers (1)

Jaykishan Sewak
Jaykishan Sewak

Reputation: 822

In QuestionAdapter class

Don't use else if condition use only else

forEX

Replace

  else if(!qgs.get_ischecked())

To

  else 

Upvotes: 0

Related Questions