Reputation: 61
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
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