android - How to control radio button states within a custom SimpleCursorAdapter via bindView / newView for a listfragment -


i have listfragment manages row(s) of 2 radio buttons per row, 1 button allowed checked, i've not been able manage radio button states properly.

i'm pretty familiar listview's recycling of views. i've tried many different avenues no success, realize have keep states of radio buttons, list position , whether button has been initialized yet separately, can interface. it's , when set radio button states within adapter i've been wrestling with. i've tried has 1 condition or interfering other. setting radio button database initially, when there recycled view no radio button check , radiogroup.clearcheck() seems override when user chooses button.

the state of radio buttons should controlled 2 sources;

database source: 1) database column has value i'd set radio button initially, i'd show checked (.setchecked(true)) when user hasn't had interaction row yet, besides scrolling/no clicks. or database column 0 , no radio button should checked.

user action: 2) users selects 1 of 2 buttons, should override value of database column.

following rough framework fragments , adapters have:

the listview row xml file stackoverflow_2_radiobuttons_row.xml

<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/background" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:divider="@color/gray" android:dividerheight="5dp" >  <linearlayout     android:id="@+id/linear_layout"     android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:layout_marginleft="@dimen/default_text_left_margin"     android:layout_marginright="@dimen/default_text_left_margin"     android:orientation="vertical" >      <radiogroup         android:id="@+id/radiogroup"         android:layout_width="wrap_content"         android:layout_height="wrap_content" >          <radiobutton             android:id="@+id/rb_1"             android:layout_width="wrap_content"             android:layout_height="fill_parent"             android:layout_alignparentleft="true"             android:layout_alignparentright="true"             android:layout_below="@+id/radiogroup"             android:layout_weight="1"             android:gravity="top"             android:paddingbottom="@dimen/default_text_top_margin"             android:text="radiobutton 1"             android:textappearance="?android:attr/textappearancemedium"             android:textstyle="bold"             android:checked="false" />          <radiobutton             android:id="@+id/rb_2"             android:layout_width="wrap_content"             android:layout_height="fill_parent"             android:layout_alignparentleft="true"             android:layout_alignparentright="true"             android:layout_below="@+id/rb_1"             android:layout_weight="1"             android:gravity="top"             android:paddingbottom="@dimen/default_text_top_margin"             android:text="radiobutton 2"             android:textappearance="?android:attr/textappearancemedium"             android:textstyle="bold"              android:checked="false"/>       </radiogroup>  </linearlayout>  </relativelayout> 

the list fragment: stackoverflow.java

public class stackoverflow extends listfragment implements     loadermanager.loadercallbacks<cursor> {  simplecursoradapter adapter; activity activity;  @override public void onactivitycreated(bundle savedinstancestate) {     super.onactivitycreated(savedinstancestate);      string[] columns = new string[] { mydb.col_rb_state };     int[] viewfields = new int[] {  };      adapter = new stackoverflowadapter(getactivity(),     r.layout.stackoverflow_2_radiobuttons_row.xml,             null, columns, viewfields);     setlistadapter(adapter);     getloadermanager().initloader(0, null, this);  }  handler handler = new handler();  @override public loader<cursor> oncreateloader(int id, bundle args) {     string[] projection = new string[] {              mydb.col_rb_state };      cursorloader loader = new cursorloader(getactivity(),             myprovider.content_uri, projection, null, null, null);     string[] argz = new string[] { "'text'" };     return loader; }  @override public void onloadfinished(loader<cursor> arg0, cursor cursor) {     ((simplecursoradapter) this.getlistadapter()).swapcursor(cursor); }  @override public void onloaderreset(loader<cursor> arg0) {     ((simplecursoradapter) this.getlistadapter()).swapcursor(null); } } 

the custom list fragment adapter: stackoverflowadapter.java

public class stackoverflowadapter extends simplecursoradapter {  private context context; private final layoutinflater inflater; private int pos = 0;  radiogroup radiogroup; int irowid = -1; string row_id;  activity testactivity;   protected static class viewholder {      protected textview h_rb1;     protected textview h_rb2;     protected textview h_radiogroup;     protected int h_position;  }  public stackoverflowadapter(context context, int layout, cursor c,         string[] from, int[] to) {     super(context, layout, c, from, to);     this.context = context;     inflater = layoutinflater.from(context); }  @override public boolean hasstableids() {     return true; }  viewholder holder;  public view newview(context context, cursor cursor, viewgroup parent) {     holder = new viewholder();     view view = inflater.inflate(r.layout.stackoverflow_2_radiobuttons_row, parent, false);     holder.h_rb1 = (radiobutton) view.findviewbyid(r.id.rb_1);     holder.h_rb2 = (radiobutton) view.findviewbyid(r.id.rb_2);     holder.h_radiogroup = (radiobutton) view.findviewbyid(r.id.radiogroup);     holder.h_position = (pos);      if (cursor != null) {         bindview(view, context, cursor);     }     view.settag(holder);      return view; }  public void bindview(view view, final context context, cursor cursor) {      holder = (viewholder) view.gettag();      final radiobutton rb_1 = (radiobutton) view             .findviewbyid(r.id.rb_1);     final radiobutton rb_2 = (radiobutton) view             .findviewbyid(r.id.rb_2);     final radiogroup radiogroup = (radiogroup) view.findviewbyid(r.id.radiogroup);       radiogroup             .setoncheckedchangelistener(new radiogroup.oncheckedchangelistener() {                  @override                 public void oncheckedchanged(radiogroup group, int checkedid) {                      if (checkedid == rb_1.getid()) {                         rb_1.setchecked(true);                     } else if (checkedid == rb_2.getid()) {                         rb_2.setchecked(true);                     }                    }              });   }  } 

i've seen lot of answers using getview, haven't been able find example or theory using bindview , newview in custom simplecursoradapter radio button states. haven't been successful manipulating in newview, i've been working in bindview. @ point i'm not sure how proceed. or guidance appreciated.

have great day.


Comments

Popular posts from this blog

windows - Single EXE to Install Python Standalone Executable for Easy Distribution -

c# - Access objects in UserControl from MainWindow in WPF -

javascript - How to name a jQuery function to make a browser's back button work? -