I can't click the ListView in android?

12,527

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.

Share:
12,527
Amarnath
Author by

Amarnath

Mobile Applications Developer | Flutter | Android Native | Kotlin | Dart | iOS | Wearables

Updated on August 04, 2022

Comments

  • Amarnath
    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
    lfxgroove about 11 years
    I 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.