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"
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.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With