android - how to maintain inflated radio button state in listView -


so have listview i'm populating static xml, inside xml have dynamic container inflate items when user clicks on item in listview.

basically view(s) i'm inflating looks (x) amount of radio buttons , textview.

the reason have way amount of radio buttons inflated change depending on type of list item is.

the issue i'm running once radio buttons inflated , user selects button, list doesn't save state user last selected radio button. or rather, recycles radio button state position in list. correct since that's listview does. want save user selected answer @ position selected in listview.

i've been working on week , can't find solution. if i'd appreciate it. i'll post relevant code below.

surveyview (custom container inflate views into)

public class surveyview extends linearlayout { private linearlayout pollcontainer; private context context; private string type; private int numofanswers; private listview answerslist; private arraylist<string> answers; private boolean visibility = true; private onclicklistener listener; private arraylist<view> options; private static int tag = 88888888; private arraylist<boolean> checked; private integer[] percent = {33, 25, 15, 20, 7}; private int position;   /**  * @param context      context of activity  * @param type         type of poll  * @param numofanswers if poll multiple choice (most likely) provide number of answers.  */ public void setlayout(final context context, string type, int numofanswers, final int position) {     this.type = type;     this.numofanswers = numofanswers;     this.context = context;     this.position = position;      switch (type) {         case "multiple":             if (visibility) {                 (int = 0; < numofanswers; i++) {                     view v = layoutinflater.from(getcontext()).inflate(r.layout.poll_multiple_choice_answers_row, null);                     view space = layoutinflater.from(getcontext()).inflate(r.layout.space, null);                      v.settag(tag);                     options.add(v);                     final radiobutton rb = (radiobutton) v.findviewbyid(r.id.answer_voted_button);                     rb.setclickable(false);                     rb.setfocusable(false);                       tag++;                     addview(v);                     addview(space);                 }             }             break;         case "slider":             break;         case "tree":             break;         case "sentiment":             break;     } }  public surveyview(context context, attributeset attrs) {     super(context, attrs);     setorientation(vertical);     options = new arraylist<>(); }  public boolean isvisibility() {     return visibility; }  public void setvisibility(boolean visibility) {     this.visibility = visibility; }  public void setanswers(int position) {     radiobutton rb;     (int = 0; < options.size(); i++) {         if (i != position) {             rb = (radiobutton) options.get(i).findviewbyid(r.id.answer_voted_button);             rb.setchecked(false);         }         else {             rb = (radiobutton) options.get(position).findviewbyid(r.id.answer_voted_button);             rb.setchecked(true);             (int p = 0; p < options.size(); p++) {                 textview answer = (textview) options.get(p).findviewbyid(r.id.poll_answer);                 answer.settext("abraham lincoln");                 textview tv = (textview) options.get(p).findviewbyid(r.id.answer_percent);                 tv.settext(integer.tostring(percent[p]));                 options.get(p).setbackground(new percentdrawable(percent[p], context.getresources().getcolor(r.color.icitizen_poll_opaque_gold)));             }         }     } } 

adapter listview

pollsadapter extends baseadapter { private layoutinflater inflater; private context context; private arraylist<card> data; private arraylist<relativelayout.layoutparams> params; private arraylist<integer> pollanswers; private int selectedposition = 0;  public pollsadapter(context context, arraylist<card> data,                     arraylist<relativelayout.layoutparams> params,                     arraylist<integer> pollanswers) {     this.context = context;     this.data = data;     inflater = layoutinflater.from(context);     this.params = params;     this.pollanswers = pollanswers; }  public static class viewholder {     textview type;     textview time;     textview text;     textview space;     textview pollspace;     imageview type_icon;     surveyview answerview;     radiobutton rb;     arraylist<view> options;      private viewholder() {     }      private viewholder(textview type, textview time, textview text, imageview type_icon, surveyview answerview) {         this.type = type;         this.time = time;         this.text = text;         this.type_icon = type_icon;         this.answerview = answerview;     }      public textview gettype() {         return type;     }      public void settype(textview type) {         this.type = type;     }      public textview gettime() {         return time;     }      public void settime(textview time) {         this.time = time;     }      public textview gettext() {         return text;     }      public void settext(textview text) {         this.text = text;     }      public imageview gettype_icon() {         return type_icon;     }      public void settype_icon(imageview type_icon) {         this.type_icon = type_icon;     }      public surveyview getanswerview() {         return answerview;     }      public void setanswerview(surveyview answerview) {         this.answerview = answerview;     } }  @override public int getcount() {     return data.size(); }  @override public object getitem(int position) {     return data.get(position); }  @override public long getitemid(int position) {     return 0; }  @override public view getview(final int position, view convertview, viewgroup parent) {     final viewholder viewholder;     if (convertview == null) {         viewholder = new viewholder();         convertview = inflater.inflate(r.layout.polls_card_layout, null);         viewholder.type = (textview)convertview.findviewbyid(r.id.card_type);         viewholder.time = (textview)convertview.findviewbyid(r.id.card_poll_time);         viewholder.text = (textview)convertview.findviewbyid(r.id.card_text);         viewholder.space = (textview)convertview.findviewbyid(r.id.card_space);         viewholder.pollspace = (textview)convertview.findviewbyid(r.id.poll_space);         viewholder.type_icon = (imageview)convertview.findviewbyid(r.id.card_icon);         viewholder.answerview = (surveyview)convertview.findviewbyid(r.id.poll_component);         viewholder.rb = (radiobutton)viewholder.answerview.findviewbyid(r.id.answer_voted_button);         convertview.settag(viewholder);     }     else {         viewholder = (viewholder)convertview.gettag();     }      viewholder.type.settext(data.get(position).gettype());     viewholder.time.settext(data.get(position).gettime());     viewholder.text.settext(data.get(position).gettext());     viewholder.answerview.setlayoutparams(params.get(position));     viewholder.answerview.setlayout(context, "multiple", 5, position);     viewholder.answerview.setvisibility(false);     viewholder.answerview.setanswers(pollanswers.get(position));      return convertview; } 

the fragment listview

surveylistfragment extends listfragment { private arraylist<card> cardlist; private pollsadapter adapter; private arraylist<answer> answers; arraylist<integer> visible; private arraylist<relativelayout.layoutparams> params; private arraylist<integer> pollanswers;  /**     when user clicks on poll display poll options  */ @override public void onlistitemclick(listview l, view view, final int position, long id) {     final pollsadapter.viewholder holder = (pollsadapter.viewholder)adapter.getview(position, view, l).gettag();     if (holder.getanswerview().getheight() == 0) {          relativelayout.layoutparams params = new relativelayout.layoutparams(relativelayout.layoutparams.wrap_content, relativelayout.layoutparams.wrap_content);         params.addrule(relativelayout.below, r.id.poll_space);         params.addrule(relativelayout.right_of, r.id.card_icon);         //holder.getanswerview().setlayoutparams(params);         this.params.set(position, params);          (int = 0; < holder.getanswerview().getoptions().size(); i++) {             holder.getanswerview().getoptions().get(i).setonclicklistener(new view.onclicklistener() {                 @override                 public void onclick(view v) {                     (int p = 0; p < holder.getanswerview().getoptions().size(); p++) {                         if (holder.getanswerview().getoptions().get(p) == v) {                             holder.getanswerview().setanswers(p);                             pollanswers.set(position, p);                             adapter = new pollsadapter(getactivity(), cardlist, surveylistfragment.this.params, pollanswers);                             setlistadapter(adapter);                         }                     }                 }             });         }     }     else {         holder.getanswerview().setvisibility(false);         relativelayout.layoutparams params = new relativelayout.layoutparams(relativelayout.layoutparams.wrap_content, 0);         params.addrule(relativelayout.below, r.id.poll_space);         params.addrule(relativelayout.right_of, r.id.card_icon);         this.params.set(position, params);        // holder.getanswerview().setlayoutparams(params);         adapter.notifydatasetchanged();     }     super.onlistitemclick(l, view, position, id); }  @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) {     return super.oncreateview(inflater, container, savedinstancestate); }  @override public void onviewcreated(view view, bundle savedinstancestate) {     super.onviewcreated(view, savedinstancestate);     setlistadapter(adapter); }  @override public void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);     setretaininstance(true);     cardlist = new arraylist<>();     answers = new arraylist<>();     visible = new arraylist<>();     params = new arraylist<>();     pollanswers = new arraylist<>();     answer answer = new answer();     answer.settext("one");     answers.add(answer);     answer = new answer();     answer.settext("two");     answers.add(answer);     answer = new answer();     answer.settext("three");     answers.add(answer);     answer = new answer();     answer.settext("four");     answers.add(answer);      card card = new card();     card.settype("polls");     card.settext("what issue listed below see priority nashville’s next mayor?");     card.settime("closing soon");       (int = 0; < cardlist.size(); i++) {         relativelayout.layoutparams params = new relativelayout.layoutparams(relativelayout.layoutparams.wrap_content, 0);         params.addrule(relativelayout.below, r.id.poll_space);         params.addrule(relativelayout.right_of, r.id.card_icon);         this.params.add(params);         pollanswers.add(-1);      }     adapter = new pollsadapter(getactivity(), cardlist, params, pollanswers); } 

parse survey object view class when create convertview. , parse new object every time recycle previous views. here codes.

1) initialize views in productlistitemview

public productlistitemview(context context, productitem item) {     super(context);     mproductitem = item;     initview(context); }  /**  * function sets views contained in framelayout  *  * @param context  */ private void initview(context context) {     addview(layoutinflater.from(context).inflate(r.layout.list_item_product, null));     butterknife.inject(this);     if (mproductitem != null) {         setproductitem(mproductitem);     } } 

2) set object view

public void setproductitem(final productitem item) {      /**      * clear listener. important!! cause android recycle view      * whatever want reset recycled view or new view      */     mpurchase.setonclicklistener(null);      endorsed_by_image.setvisibility(invisible);     endorsed_by_name.setvisibility(invisible);     mbtnendorse.setoncheckedchangelistener(null);     mproductitem = item;     mproductname.settext(mproductitem.getname()); 

3) in adapter

    @override     public view getview(int position, view convertview, viewgroup parent) {          final productitem item = mproducts.get(position);          if (convertview == null) {             convertview = new productlistitemview(getactivity(), item);         } else {             ((productlistitemview) convertview).setproductitem(item);         }     }  

hope explain well.

and in getview(), better implement viewholder. visit http://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html


Comments

Popular posts from this blog

PHP DOM loadHTML() method unusual warning -

python - How to create jsonb index using GIN on SQLAlchemy? -

c# - TransactionScope not rolling back although no complete() is called -