I can't click the ListView in android?
Solution 1
in nested Views, the child view always gets all the touch events first. if you want the parent view (in your case, the listView row), to get a touch event, you must return false on the child events or set them to be android:clickable="false"
in the manifest.
Solution 2
add
android:focusable="false"
and
android:clickable="false"
for each child view like imageview,textview,checkbox etc... of your row layout means in manage_track_list_custom_view.xml
Solution 3
I think you have to set all your clickable things eg. checkboxes, buttons etc. as not focusable(in the adapter class).
holder.yourButton.setFocusable(false);
holder.yourButton.setFocusableInTouchMode(false);
holder.yourCheckbox.setFocusable(false);
holder.yourCheckbox.setFocusableInTouchMode(false);
Solution 4
Try this:
When you add the listView, call
setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS);
Have a look here for more info.
Amarnath
Mobile Applications Developer | Flutter | Android Native | Kotlin | Dart | iOS | Wearables
Updated on August 04, 2022Comments
-
Amarnath over 1 year
I made an app using contact sync. I list the following contact info with photo, name and number. I successfully list all those things in a custom ListView, but I can't click the ListView. It looks like locked, Unable to click it.
But I made a same procedure to another activity. Using custom ListView but I can click this view and it works fine.
What is the problem? here is my sample coding:
ListView settingsList = (ListView) findViewById(R.id.manage_track_listView); ArrayList<ContactList> MySettingsList = new ArrayList<ContactList>(); ContactList setting1 = new ContactList("contact name 1", "Number 1", null); ContactList setting2 = new ContactList("contact name 2", "Number 2", null); ContactList setting3 = new ContactList("contact name 3", "Number 3", null); MySettingsList.add(setting1); MySettingsList.add(setting2); MySettingsList.add(setting3); ContactList list[] = new ContactList[MySettingsList.size()]; for(int i=0;i<MySettingsList.size();i++) { ContactList mySettings = MySettingsList.get(i); list[i] = new ContactList(mySettings.getName(), mySettings.getNumber(), mySettings.getImageIcon()); } ContactListAdapter adapter = new ContactListAdapter(this, R.layout.manage_track_list_custom_view, list); settingsList.setAdapter(adapter); System.out.println("before listener"); settingsList.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub System.out.println("Clicked " + position); } }); System.out.println("after listener");
Here ContactList is a class which has contact name, number, and byte[] for imageBlob. If the image is null I set the default ic_launcher as a contact image. The adapter class is:
public class ContactListAdapter extends ArrayAdapter<ContactList> { Context context; int layoutResourceId; ContactList objects[] = null; View row; public ContactListAdapter(Context context, int layoutResourceId, ContactList[] objects) { super(context, layoutResourceId, objects); // TODO Auto-generated constructor stub this.context = context; this.layoutResourceId = layoutResourceId; this.objects = objects; System.out.println(objects[1].getName()); System.out.println(objects[1].getNumber()); System.out.println(objects[1].getImageIcon()); } @Override public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub row = convertView; final ContactListHolder holder; if ( row == null ) { LayoutInflater inflater = ((Activity)context).getLayoutInflater(); row = inflater.inflate(layoutResourceId, parent, false); holder = new ContactListHolder(); holder.image = (ImageView) row.findViewById(R.id.contactImage); holder.name = (TextView) row.findViewById(R.id.contactName); holder.number = (TextView) row.findViewById(R.id.contactNumber); holder.check = (CheckBox) row.findViewById(R.id.selectedContact); row.setTag(holder); } else { holder = (ContactListHolder)row.getTag(); } ContactList contact = objects[position]; if(contact.imageIcon != null) { Bitmap imgBitmap = BitmapFactory.decodeByteArray(contact.imageIcon, 0, contact.imageIcon.length); holder.image.setImageBitmap(imgBitmap); } else { holder.image.setImageResource(R.drawable.ic_launcher); } holder.name.setText(contact.name); holder.number.setText(contact.number); holder.check.setChecked(objects[position].isSelected()); return row; } static class ContactListHolder { ImageView image; TextView name; TextView number; CheckBox check; } }
I Have more than 100 contacts so added only 3 objects. In this contact list I successfully receive contact image, name, number.
What is the problem the ListView is unable to click? I hope any one of u will guide me. Thanks in advance.
Thanks to all. now got the result by just adding
android:focusable="false"
in my all child views. thanks for ur guidings. -
lfxgroove about 11 yearsI think this should be marked as the answer as this allows items inside a list view to be clicked at the same time as the list items themselves to receive events.