Skip to content Skip to sidebar Skip to footer

Android Listview With Radiobutton In Singlechoice Mode And A Custom Row Layout

I have a ListView, which is in single-choice mode. All I want is to display a RadioButton to the side, that when clicked highlights to say it is selected, and when a different one

Solution 1:

Do bear in mind that in the ListView row items are RECYCLED. This is likely to explain why actions on one row are affecting another. Dig around in Mark's book and you'll find coverage of this.

If you're using an adapter with the list, you can use getView() on an adapter to add a click handler to each row as it's created/recycled, and make sure the state is managed correctly as the row items are created and recycled.

My approach is to store the state in my own data structure, and then use getView() to mirror that in the UI as the user scrolls up and down the ListView. There may be a better solution, but that works for me.

Solution 2:

Simple solution:

Add this line in the RadioButton layout of your xml file:

<RadioButton...android:onClick="onClickRadioButton"...
/>

Then in the activity class that uses the ListView, add the following:

privateRadioButtonlistRadioButton=null;
   intlistIndex= -1;

   publicvoidonClickRadioButton(View v) {
        ViewvMain= ((View) v.getParent());
        // getParent() must be added 'n' times, // where 'n' is the number of RadioButtons' nested parents// in your case is one.// uncheck previous checked button. if (listRadioButton != null) listRadioButton.setChecked(false);
        // assign to the variable the new one
        listRadioButton = (RadioButton) v;
        // find if the new one is checked or not, and set "listIndex"if (listRadioButton.isChecked()) {
            listIndex = ((ViewGroup) vMain.getParent()).indexOfChild(vMain); 
        } else {
            listRadioButton = null;
            listIndex = -1;
        }
    }

With this simple code only one RadioButton is checked. If you touch the one that is already checked, then it returns to the unchecked mode.

"listIndex" is tracking the checked item, -1 if none.

If you want to keep always one checked, then code in onClickRadioButton should be:

publicvoidonClickRadioButton(View v) {
        ViewvMain= ((View) v.getParent());
        intnewIndex= ((ViewGroup) vMain.getParent()).indexOfChild(vMain);
        if (listIndex == newIndex) return;

        if (listRadioButton != null) {
                listRadioButton.setChecked(false);
        }
        listRadioButton = (RadioButton) v;
        listIndex = newIndex; 
    }

Solution 3:

My Name Is Gourab Singha. I solved This Issue. I have Written This Code to solve it. I hope this helps you all. Thanks. I require 3 hours for this.

publicvoidadd_option_to_list(View v){


    LinearLayoutll= (LinearLayout)v.getParent();
    LinearLayoutll_helper=null; 
    LinearLayoutll2=  (LinearLayout)ll.getParent();
    LinearLayoutll3=  (LinearLayout)ll2.getParent();

    ListViewll4=  (ListView)ll3.getParent();
    //RadioButton rb1= (RadioButton)ll.getChildAt(1);
    Toast.makeText(getApplicationContext(), ", "+ll4.getChildCount(), Toast.LENGTH_LONG).show();    
    //ll.findViewById(R.id.radio_option_button)for(int k=0;k<ll4.getChildCount();k++){

        ll3 = (LinearLayout)ll4.getChildAt(k);
        ll2 = (LinearLayout)ll3.getChildAt(0);
        ll_helper = (LinearLayout)ll2.getChildAt(0);
        RadioButtonrb1= (RadioButton)ll_helper.getChildAt(1);
        if(rb1.isChecked())
        rb1.setChecked(false);


    }
    RadioButtonrb1= (RadioButton)ll.getChildAt(1);
    rb1.setChecked(true);
    //Toast.makeText(getApplicationContext(), ""+((TextView)ll.getChildAt(4)).getText().toString(), Toast.LENGTH_LONG).show();


    }

The XML:

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:id="@+id/id"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Category Name"android:textAppearance="?android:attr/textAppearanceMedium"android:visibility="gone" /><RadioButtonandroid:id="@+id/radio_option_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="add_option_to_list"android:text="" /><TextViewandroid:id="@+id/option_name"android:layout_width="wrap_content"android:layout_height="fill_parent"android:layout_marginLeft="3dp"android:layout_weight="5.35"android:text="Category Name"android:textAppearance="?android:attr/textAppearanceMedium" /><TextViewandroid:id="@+id/option_price"android:layout_width="76dp"android:layout_height="wrap_content"android:layout_marginRight="10dp"android:gravity="right"android:text="$0.00"android:textAppearance="?android:attr/textAppearanceMedium" /><TextViewandroid:id="@+id/option_unit_price"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginRight="5dp"android:gravity="right"android:text="$0.00"android:textAppearance="?android:attr/textAppearanceMedium"android:visibility="gone" /></LinearLayout></LinearLayout></LinearLayout>

Solution 4:

I've just had a similar problem. It seemed that it was related to views recycling. But I added Log's everywhere and noticed that the recycling handling was fine. The problem was RadioButtons handling. I was using:

if(answer == DBAdapter.YES){
   rbYes.setChecked(true); 
   rbNo.setChecked(false);                    
}
else if(answer == DBAdapter.NO){
   rbYes.setChecked(false); 
   rbNo.setChecked(true);
}
else{
  rbYes.setChecked(false); 
  rbNo.setChecked(false);
}                

and the correct way of doing it is:

if(answer == DBAdapter.YES){
   rbYes.setChecked(true); 
}
elseif(answer == DBAdapter.NO){
   rbNo.setChecked(true);
}
else{
   RadioGrouprg= (RadioGroup)(holder.answerView);
   rg.clearCheck();
}                

Solution 5:

You can achieve much more simple, follow this. It was tried in MarshMallow

1)Have a CheckedTextView :

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:checkMark="?android:attr/listChoiceIndicatorSingle"
    android:padding="10dp"
    android:textAppearance="?android:attr/textAppearanceMedium">

  • ListChoiceIndicatorSingle will display RadioButton.

  • ListChoiceIndicatorMultiple will display CheckBox

Don't forgot to put choiceMode:Single in your ListView.

Post a Comment for "Android Listview With Radiobutton In Singlechoice Mode And A Custom Row Layout"