0

I am not able to set customized color to a Radio Button in a listview at selected position. It is getting selected at different position and at the same time if i scroll the listview the items i selected are changing the position as well as the Radio button.

List of items were populated from Database and able to inflate the items.

activity_student_stats.xml code is here:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:background="@android:color/transparent"
android:orientation="horizontal"
android:weightSum="3" >

<TextView
    android:id="@+id/name"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1.6"
    android:maxLength="25"
    android:padding="10dp"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="#000000"
    >
</TextView>

<RadioGroup
    android:id="@+id/radiogroup1"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_marginLeft="15dp"
    android:layout_weight="1.4"
    android:clickable="false"
    android:descendantFocusability="blocksDescendants"
    android:gravity="center_horizontal"
    android:orientation="horizontal"
    android:weightSum="1.4" >

    <RadioButton
        android:id="@+id/present_radio"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_weight="0.6"
        android:button="@drawable/radio_background"
         />

    <RadioButton
        android:id="@+id/absent_radio"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_weight="0.6"
        android:button="@drawable/radio_background"

         />
</RadioGroup>

</LinearLayout>

Here is my code for Custom Adapter:

public class ArrayAdapterActivity extends ArrayAdapter<String>{

private Context context;
private List<String> StudentInfo;
int pos=0;

private boolean userSelected=false;
private RadioButton mcheckedRB;
ViewHolder holder;

public ArrayAdapterActivity(Context context, String[] values){

    super(context, R.layout.activity_student_stats, values);

    this.context=context;

    this.StudentInfo=Arrays.asList(values);


}

public ArrayAdapterActivity(Context context){

    super(context, R.layout.activity_student_stats);
    this.context=context;
}

@Override
public boolean hasStableIds(){

    return true;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent){

    View rowView=convertView;

    if(convertView==null){

    LayoutInflater infalter=  (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView=infalter.inflate(R.layout.activity_student_stats, parent,false);

        holder=new ViewHolder();//Holder initiation

        holder.position=position;

        holder.label=(TextView) rowView.findViewById(R.id.name);

        holder.presentAbsentRadio=(RadioGroup) rowView.findViewById(R.id.radiogroup1);
        holder.present_radio=(RadioButton) rowView.findViewById(R.id.present_radio);
        holder.absent_radio=(RadioButton) rowView.findViewById(R.id.absent_radio);
        rowView.setTag(holder);
        holder.presentAbsentRadio.setTag(position);
        holder.present_radio.setTag(position);
        holder.absent_radio.setTag(position);

    }
    else{

        holder=(ViewHolder) rowView.getTag();
    }

    holder.label.setText(StudentInfo.get(position).toString());

    if(position==getCount()-1 && userSelected == false){

        mcheckedRB=holder.present_radio;
    }

    holder.presentAbsentRadio.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(RadioGroup radiogrp, int CheckedId) {
            // TODO Auto-generated method stub

            boolean isSelected=(CheckedId==R.id.present_radio);
            int getposition=(Integer) radiogrp.getTag();

            if(CheckedId==R.id.present_radio){
                holder.present_radio.setButtonDrawable(R.drawable.radio_button_green);

                holder.present_radio.setSelected(true);

                //To Uncheck the absent button incase it was checked

                holder.absent_radio.setButtonDrawable(R.drawable.radio_background);
                holder.absent_radio.setChecked(false);
            }
            else{

                holder.absent_radio.setButtonDrawable(R.drawable.radio_button_red);
                holder.absent_radio.setSelected(true);

                //To Uncheck the present button incase it was checked

                holder.present_radio.setButtonDrawable(R.drawable.radio_background);
                holder.present_radio.setChecked(false);

            }

        }});


    return rowView;

}

static class ViewHolder{

    int position;
    TextView label;
    RadioGroup presentAbsentRadio=null;
    RadioButton present_radio=null;
    RadioButton absent_radio=null;
}
}

I am not able to implement setonItemClickListner() and setOnCheckedChangeListner() at a time.

Here is my Activity class:

public class AttendanceActivity extends ActionBarActivity implements OnClickListener, OnItemClickListener {

LinearLayout listview;
Expandableview EV = new Expandableview();
public static Button chooseclass_btn, choosesection_btn, choosesubject_btn,submit;
static ListView class_listview, section_listview, subject_listview, lv,datalstview;

protected String text = "", classitemclicked,sectionitemclicked,subjectitemclicked,_class,_section;
String StudentAttendanceInfo;


ArrayList<String> studentName = null;// To store the Student name from listview
ArrayList<String> RadioGrp=null;

String[] class_output,section_output,subj_output, stud_data;

ArrayAdapterActivity mlistadapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_attendance);        

    chooseclass_btn = (Button) findViewById(R.id.chooseclass_btn);
    choosesection_btn = (Button) findViewById(R.id.choosesection_btn);
    choosesubject_btn = (Button) findViewById(R.id.choosesubject_btn);

    listview = (LinearLayout) findViewById(R.id.listview_layout);
    class_listview = (ListView) findViewById(R.id.class_listview);
    section_listview = (ListView) findViewById(R.id.section_listview);
    subject_listview = (ListView) findViewById(R.id.subject_listview);

    submit=(Button)findViewById(R.id.submit);

    datalstview=(ListView) findViewById(android.R.id.list);

    //listview.setVisibility(View.GONE);

    //************************** onclick Event *****************************
    //*******************of Choose Class button*****************************//

    chooseclass_btn.setOnClickListener(this);

    submit.setOnClickListener(this);

    class_listview.setOnItemClickListener(this);

    section_listview.setOnItemClickListener(this);

    subject_listview.setOnItemClickListener(this);

    datalstview.setOnItemClickListener(this);

    datalstview.setOnScrollListener(new AbsListView.OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            // TODO Auto-generated method stub

            int first = view.getFirstVisiblePosition();
            int count = view.getChildCount();

            Toast.makeText(getApplicationContext(), "Scroll State:: " + scrollState, Toast.LENGTH_SHORT).show();
            Toast.makeText(getApplicationContext(), "Cout of listview items:: " + view.getCount(), Toast.LENGTH_SHORT).show();

            if (scrollState == SCROLL_STATE_IDLE || (first + count > view.getCount()) ) {
                datalstview.invalidateViews();

            }
        }

        @Override
        public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
            // TODO Auto-generated method stub

        }
    });

}

@Override
public void onItemClick(AdapterView<?> listadapter, View v,
        final int pos, long id) {
    // TODO Auto-generated method stub

    if(listadapter.getId()==R.id.class_listview){

        classitemclicked=(String)listadapter.getItemAtPosition(pos);        
        chooseclass_btn.setText(classitemclicked);
        class_listview.setVisibility(View.GONE);

        new GetDetails(getApplicationContext(), R.id.section_listview).execute();

    }
    else if(listadapter.getId()==R.id.section_listview){

        sectionitemclicked=(String)listadapter.getItemAtPosition(pos);

        choosesection_btn.setText(sectionitemclicked);
        section_listview.setVisibility(View.GONE);

        new GetDetails(getApplicationContext(), R.id.subject_listview).execute();
    }

    else if(listadapter.getId()==R.id.subject_listview){

        subjectitemclicked=(String)listadapter.getItemAtPosition(pos);

        choosesubject_btn.setText(subjectitemclicked);
        subject_listview.setVisibility(View.GONE);

        Toast.makeText(getApplicationContext(), "Subject id" + android.R.id.list, Toast.LENGTH_LONG).show();

        new GetDetails(android.R.id.list,classitemclicked,sectionitemclicked).execute();
    }

    else{

  //Here we have to do task to handle the listview items which are clicked                
  }
 }
}

1 Answers1

0

use xml drawable for customizing the radio button look. don't programmatically change the background.

check this Adding custom radio buttons in android

and your checked status abnormal is because you are not storing them.

you should store your checked status also. and set in getView. like how you setting name

holder.label.setText(StudentInfo.get(position).toString());

use selector drawable for cutomizing radio button.

and you don't have to set checked status manually to uncheck other radio button. it automatically handled when they are added in radio group

Community
  • 1
  • 1
Pratap
  • 11
  • 1
  • 5
  • Hello, Thanks for the suggestion. But my scenario is this, I have two radio buttons in Radio group. on selection of a radio button one should trun green and another should turn into red. – Chandrasekhar Rao Oct 31 '14 at 18:44