ListView items are not clickable. why?
Asked Answered
S

12

30

I have a ListView that uses a customized adapter, but I can't click on the ListView Item ..

Activity for list view ..

package com.adhamenaya.projects;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.adhamenaya.classes.Place;

public class PlacesListActivity extends Activity {
    private ArrayList<Place> places;
    private ArrayList<String> items;
    GridviewAdapter mAdapter;
    private ListView lvPlaces;
    private EfficientAdapter adap;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.places_list);
        lvPlaces = (ListView) this.findViewById(R.id.lvPlaces);
        new DowanloadPlaces().execute("");
    }
    private void bindList(ArrayList<Place> places) {
        this.places = places;
        // Start creating the list view to show articles
        items = new ArrayList<String>();
        for (int i = 0; i < places.size(); i++) {
            items.add(String.valueOf(places.get(i).mName));
        }
        adap = new EfficientAdapter(this);
        adap.notifyDataSetChanged();
        lvPlaces.setAdapter(adap);
    }

    // EfficientAdapter : to make a customized list view item
    public class EfficientAdapter extends BaseAdapter implements Filterable {

        // The function of inflater to convert objects from XML layout file (i.e. main.xml) to a programmable 
        LayoutInflater inflater;
        Context context;

        public EfficientAdapter(Context context) {
            inflater = LayoutInflater.from(context);
            this.context = context;
        }

        public int getCount() {
            // Get the number of items in the list
            return items.size();
        }

        public Object getItem(int position) {
            // To return item from a list in the given position 
            return items.get(position);
        }

        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }

        public View getView(final int position, View convertView,ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.adaptor_content, null);

                holder = new ViewHolder();// Create an object to hold at components in the list view item
                holder.textLine = (TextView) convertView.findViewById(R.id.textLine);
                holder.buttonLine = (Button) convertView.findViewById(R.id.buttonLine);
                holder.buttonLine.setOnClickListener(new OnClickListener() {
                    private int pos = position;

                    public void onClick(View v) {
                        places.remove(pos);
                        bindList(places);// to bind list items
                        Toast.makeText(getApplicationContext(),"Deleted successfuly :)", Toast.LENGTH_LONG).show();
                    }
                });
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            // Bind the data efficiently with the holder.
            holder.textLine.setText(String.valueOf(places.get(position).mName));
            return convertView;
        }

        public Filter getFilter() {
            // TODO Auto-generated method stub
            return null;
        }

    }

    // ViewHolder : class that represents a list view items
    static class ViewHolder {
        TextView textLine;
        Button buttonLine;
    }

    // DownloadRSSFeedsTask: works in a separate thread
    private class DowanloadPlaces extends AsyncTask<String, Void, ArrayList<Place>> {

        @Override
        protected ArrayList<Place> doInBackground(String... params) {
            ArrayList<Place> places = new ArrayList<Place>();
            Place p = new Place();
            for(int i =0;i<25;i++){
                p.mName = "Al Mathaf Hotel";
                places.add(p);              
            }

            return places;
        }

        @Override
        protected void onPostExecute(ArrayList<Place> places) {
            bindList(places);


        }

    }


}

places_list.xml layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ListView 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content"
        android:id="@+id/lvPlaces">

    </ListView>
</LinearLayout>

adaptor_content.xml layout

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/textLine"
    android:layout_centerVertical="true"
    android:src="@drawable/settings" />

</RelativeLayout>
Southerland answered 21/1, 2012 at 17:59 Comment(5)
where is your OnClickListener for the ListView?Knotts
What behavior do you see that leads you to believe it's not clickable? Are you sure that the ListView item is set to be clickable? If it isn't, then onClick events won't be generated. In general, if you run into a problem: 1. First do as much debugging as you can. 2. If you expect a behavior and it doesn't happen, be sure your code is reaching the point where you'd expect the behavior to occur. If it doesn't, post the code and the question "why isn't my code reaching point <x>"? 3. If you're getting a crash, post the crash message and stack trace, and then ask "Why is my code aborting here?" MPicaresque
I would also use a ContextMenu for the list items for the task like that(delete list item) but it's up to you I guess...Knotts
You can try this solution: https://mcmap.net/q/471963/-listview-is-not-clickable-all-widgets-in-rows-are-textview That's helped me with similar problem.Legate
Check this answer. It worked to me https://mcmap.net/q/433220/-click-is-not-working-on-the-listitem-listview-androidNathanielnathanil
L
2

try this to get the focus: View.getFocus();

Libeler answered 21/1, 2012 at 18:15 Comment(1)
I think this is no longer availableAntagonistic
P
139

Android doesn't allow to select list items that have focusable elements (buttons). Modify the button's xml attribute to:

android:focusable="false"

It should still be clickable, just won't gain focus...

Polack answered 21/1, 2012 at 18:20 Comment(4)
FYI: This occurs not only with buttons but with TextViews that have a background set. I used focusable="false" to get around it.Phelgon
Correct i put everything under android:focusable="false" and now all good :DImprovisation
I am currently having the same problem. But with a editText inside a list item. If i do focusable="false" I can no longer change the value in my editText is there a way to get around this?Yardarm
I also think this should be the best answer. It worked. Thanks!.Elfland
A
27

I had the same issue with a ListView which contained only a RadioButton:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >

<RadioButton
    android:id="@+id/userNameRadioButton"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

</LinearLayout>

I used the RadioButton in each row to display the default item selection, to make ListView handle clicks I had to use:

radioButton.setFocusableInTouchMode(false);
radioButton.setFocusable(false);

or in the XML-file:

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

So it is a focus related issue... With the above modifiers the focus is directed to ListView on click.

Andi answered 26/2, 2012 at 19:56 Comment(4)
Thank you for that explanation! I had a CheckBox in mine, and was wondering why I could click the CheckBox but not the ListView item. For the record, the checkbox (or in your case the radio button) can remain clickable, but not focusable. Also, you can do it in XML with android:focusable="false" android:focusableInTouchMode="false"Contradiction
This fixed it for me. Apparently it wasn't enough to do this in xml. It worked once I did it programmatically.Finney
seems strange you have to set this in both the XML and code, but this solution worked for me. Nice Work!Mckelvey
FYI: This occurs not only with buttons but with TextViews that have a background set. I used focusable="false" to get around it.Phelgon
N
14

This answer here worked for me: https://mcmap.net/q/471964/-listview-item-is-not-clickable-in-android

Mainly he ADDED in the LinearLayout or RelativeLayout the following:

android:descendantFocusability="blocksDescendants"

You also need to REMOVE from all your xml the following:

android:focusable="false"
android:focusable="true"
android:clickable="true"
android:clickable="false"
Nathanielnathanil answered 6/10, 2015 at 23:29 Comment(2)
android:descendantFocusability="blocksDescendants" +1 for thisAlas
android:descendantFocusability="blocksDescendants" already did the trick for me +1Monkish
L
5

I wanted to add a comment to rupps answer, but I do not have enough reputation.

If you are using a custom adapter extending the ArrayAdapter you can overwrite with areAllItemsEnabled() and isEnabled(int position) in your class:

@Override
public boolean areAllItemsEnabled() {
    return true;
}

@Override
public boolean isEnabled(int position) {
    return true;
}

The above fixed my non clickable list view. Maybe this comment also helps others as "android list not clickable" search term is quite high in Google.

Limbert answered 14/7, 2014 at 8:23 Comment(1)
@MarcioGranzotto this answers works only for ArrayAdapter. how to do it with BaseAdapterFachini
A
3

Consider making the text value selectable by specifying android:textIsSelectable="true"

Don't listen to Google. In the rows' layout, set

textIsSelectable="false"

Thank you Lint (not!)

Absorbent answered 30/5, 2013 at 9:13 Comment(2)
Thanks for the +1. The textIsSelectable="false" should be next to trying after setting android:focusable="false". I know I will take Lint's suggestions with a grain of salt next time ^^Absorbent
You could try Upvoting too :) Glad to know another problem is solved too.Absorbent
L
2

try this to get the focus: View.getFocus();

Libeler answered 21/1, 2012 at 18:15 Comment(1)
I think this is no longer availableAntagonistic
S
2

I was using a view and button inside the list view so I have used:

android:focusable="false"

for <button> and <view> ...

After that I used following code for my list view and it worked

// Attach the adapter to a ListView
ListView listView = (ListView) findViewById(R.id.shipping_item_list);
listView.setAdapter(adapter);
listView.setOnItemClickListener(listPairedClickItem);

private AdapterView.OnItemClickListener listPairedClickItem = new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

    Toast.makeText(getBaseContext(), "Item ", Toast.LENGTH_LONG).show();
    }
};
Sihun answered 9/4, 2015 at 9:19 Comment(0)
K
1

List view items are clickable. To use it, you have to set item click listener on your list view. Then it will work.

Kaycekaycee answered 21/1, 2012 at 18:37 Comment(1)
Can you elaborate on the "set click listener" how would one go about doing so?Uncanny
C
1

I'm pretty late but discovered something I think it's interesting about this:

if your adapter descends from ArrayAdapter, as much as I have tried, onItemClickListener is not called.

However, if your adapter descends from BaseAdapter (so you have to implement getCount() and getItem(), trivial for an array) it IS always called.

Convenience answered 28/5, 2013 at 21:2 Comment(0)
S
0

For me, the problem was that my items within my ListView had clickable set to true.

Siloa answered 30/3, 2016 at 0:28 Comment(1)
Do you mean setting it to "false?" I have a compound view in the Listview and I set clickable to false for each of the button inside of my compound view and it works.Agon
J
0

Note that to have an item clickable in listview, all the item components must have clickable set to false. In xml Android : clickable= "false" In program setClickable(false)

Judon answered 4/7, 2021 at 23:12 Comment(1)
Are you sure this is correct? Doesn't seem to be.Delegacy
Y
-2

set android:clickable="false" android:focusable="fasle"

Yoho answered 21/2, 2013 at 12:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.