Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Listitem click doesn't work with checkboxes Android

EDIT (SOLVED) For the answer go to the bottom of the question.

I have a listview and I inflate some rows in it using a customadapter. The row being inflated contains a checkbox. I can maintain the checkbox's status, but the problem is, my list items are no more clickable. Here's my code:

public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);     fl=(ListView)findViewById(R.id.MainMenu);//Mainmenu is listview     fl.setAdapter(new CustomAdapter(Annotate.this,R.layout.preann2,_dir));//preann2 is row and _dir is the list of objects     //fl.setOnItemClickListener(this); tried this too }  public void onItemClick(AdapterView<?> a, View view, int pos, long id)  {       //Implementations }      public class CustomAdapter extends ArrayAdapter<String> {     public CustomAdapter(Context context, int textViewResourceId,String[] objects) {         super(context, textViewResourceId,objects);     }      @Override     public View getView(final int position, View convertView, ViewGroup parent) {             LayoutInflater inflater=getLayoutInflater();             View row=inflater.inflate(R.layout.preann2, parent, false);             try             {              TextView Name=(TextView)row.findViewById(R.id.title);             Name.setText("xyz");             ImageView icon=(ImageView)row.findViewById(R.id.icon);             row.setFocusable(true);             row.setClickable(true);             row.setOnClickListener(new OnClickListener(){                  @Override                 public void onClick(View v) {                     // TODO Auto-generated method stub                     checkState[position]=!checkState[position];                 }              });             CheckBox c=(CheckBox)row.findViewById(R.id.checkBox);             c.setChecked(checkState[position]);             c.setOnCheckedChangeListener(new OnCheckedChangeListener(){                  @Override                 public void onCheckedChanged(CompoundButton v,                         boolean isChecked) {                     // TODO Auto-generated method stub                     CheckBox checkBox=(CheckBox)v;                     if (isChecked) {                         checkState[position]=true;                      }                     else                         checkState[position]=false;                 }             });             /*  tried this too                                   c.setOnClickListener(new OnClickListener(){                  @Override                 public void onClick(View v) {                     CheckBox checkBox=(CheckBox)v;                     if (checkBox.isChecked()) {                         //checkBox.setChecked(false);                         checkState[position]=true;                      }                     else                         checkState[position]=false;                 }});*/             icon.setImageResource(R.drawable.ic_launcher);             }catch(Throwable err)             {                 err.printStackTrace();             }             return row;         } } 

I want the listitems to be clickable in case the user wants to click only a single item.

EDIT (on Akhil's request)- preann2.xml in layouts folder:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:layout_width="fill_parent"   android:layout_height="wrap_content"   android:orientation="horizontal"   android:padding="4dip"   >   <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_alignParentTop="true" android:layout_alignParentBottom="true" android:layout_marginRight="4dip"/>     <TextView   android:id="@+id/title"   android:layout_width="fill_parent"   android:layout_height="match_parent"   android:layout_weight="1"   android:ellipsize="end"   android:gravity="center_vertical"   android:singleLine="true"   android:textStyle="bold" />  <CheckBox   android:id="@+id/checkBox"   android:layout_width="wrap_content"   android:layout_height="wrap_content" />  </LinearLayout> 

main.xml in layouts folder:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" >   <ListView     android:id="@+id/MainMenu"     android:layout_width="match_parent"     android:layout_height="match_parent" >  </ListView>  </LinearLayout> 

EDIT (SOLVED) Just add these properties to checkbox:

  android:focusable="false"   android:focusableInTouchMode="false" 
like image 923
silentkratos Avatar asked Apr 07 '13 05:04

silentkratos


People also ask

How to handle CheckBox in android?

When the user selects a checkbox, the CheckBox object receives an on-click event. To define the click event handler for a checkbox, add the android:onClick attribute to the <CheckBox> element in your XML layout. The value for this attribute must be the name of the method you want to call in response to a click event.

How to add CheckBox in xml file?

Open “res/layout/main. xml” file, add 3 “CheckBox” and a button, inside the LinearLayout . Put android:checked="true" inside checkbox element to make it checked bu default. In this case, “Android” option is checked by default.

How to create multiple CheckBox in android dynamically?

b. setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { for(int i = 0; i < 20; i++) { CheckBox cb = new CheckBox(getApplicationContext()); cb. setText("I'm dynamic!"); ll.


1 Answers

The solution mentioned in the question solves the problem:

android:focusable="false" android:focusableInTouchMode="false" 

AbsListView checks View#hasFocusable and won't allow presses on the item if so. Thus, disable focus on all normally focusable items.

like image 174
Heath Borders Avatar answered Sep 24 '22 15:09

Heath Borders