erosebe
erosebe

Reputation: 967

Android List onListItemClick not working

I've got a new List of things that needs to be clicked but this one isn't working. onListItemClick is never called. I have another one in my app that has been working as expected and I can't figure out what the difference is. I've seen the people saying to change focusable but I've tried that a bunch of different ways with no effect. So here's some code.

Working:

@Override
protected void onListItemClick(ListView l, View v, int position, long id)
{
    super.onListItemClick(l, v, position, id);

    // get the item that was clicked
    v_ProjectInvestigatorSiteContact project = (v_ProjectInvestigatorSiteContact) this.getListAdapter().getItem(
            position);

    Intent myIntent = new Intent(this, Details.class);

    myIntent.putExtra(res.getString(R.string.project), project);

    startActivity(myIntent);
}// onListItemClick

Not Working:

    @Override
protected void onListItemClick(ListView l, View v, int position, long id)
{
    super.onListItemClick(l, v, position, id);

    // get the item that was clicked
    final v_SitePeople vSitePeople = (v_SitePeople) this.getListAdapter().getItem(
            position);

    AlertDialog.Builder builder = new AlertDialog.Builder(Share.this);
    builder.setTitle(res.getString(R.string.forgot_password_check_dialog_title))
            .setMessage(res.getString(R.string.share_check_dialog_text))
            .setPositiveButton(res.getString(R.string.send), new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    sendShareEmail(vSitePeople);
                }
            }).setNegativeButton(res.getString(R.string.cancel), new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    // cancelled, so do nothing
                }
            });
    AlertDialog msgBox = builder.create();
    msgBox.show();
}// onListItemClick

Working XML:

<?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:background="#ffffffff"
android:orientation="vertical" >

<!-- dummy item to prevent edittext from gaining focus on activity start -->

<LinearLayout
    android:layout_width="0px"
    android:layout_height="0px"
    android:focusable="true"
    android:focusableInTouchMode="true" />

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/title_background" >

    <ImageView
        android:id="@+id/logo"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_centerVertical="true"
        android:layout_marginLeft="5dp"
        android:scaleType="centerCrop"
        android:src="@drawable/ic_logo" >
    </ImageView>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/logo" 
        android:gravity="center"
        android:paddingBottom="5dp"
        android:paddingLeft="50dp"
        android:paddingRight="60dp"
        android:paddingTop="5dp"
        android:text="@string/app_header"
        android:textColor="#ffffffff"
        android:textSize="15sp"
        android:textStyle="bold" />
</RelativeLayout>

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/search_gradient" >

    <ImageView
        android:id="@+id/searchBoxIcon"
        android:layout_width="38dp"
        android:layout_height="38dp"
        android:layout_centerVertical="true"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:scaleType="centerCrop"
        android:src="@drawable/action_search" >
    </ImageView>

    <EditText
        android:id="@+id/searchBox"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="@+id/searchBoxIcon"
        android:layout_marginRight="8dp"
        android:layout_marginTop="4dp"
        android:layout_toRightOf="@+id/searchBoxIcon"
        android:background="@drawable/search_box"
        android:hint="@string/search_hint"
        android:inputType="text"
        android:maxLines="1"
        android:minHeight="30sp"
        android:paddingBottom="2dp"
        android:paddingLeft="25sp"
        android:paddingTop="2dp"
        android:textColor="#ff000000" />
</RelativeLayout>

<ListView
    android:id="@id/android:list"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:background="@color/divider_gray"
    android:cacheColorHint="#00000000"
    android:divider="@color/divider_gray"
    android:dividerHeight="1dp"
    android:footerDividersEnabled="false"
    android:headerDividersEnabled="false" />

<TextView
    android:id="@+id/android:empty"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:text="@string/loading"
    android:textColor="@color/loading_gray"
    android:textSize="20sp" />

</LinearLayout>

Not Working XML

<?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:background="#ffffffff"
android:orientation="vertical" >

<!-- dummy item to prevent edittext from gaining focus on activity start -->

<LinearLayout
    android:layout_width="0px"
    android:layout_height="0px"
    android:focusable="true"
    android:focusableInTouchMode="true" />

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/title_background" >

    <ImageView
        android:id="@+id/logo"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_centerVertical="true"
        android:layout_marginLeft="5dp"
        android:scaleType="centerCrop"
        android:src="@drawable/ic_logo" >
    </ImageView>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/logo"
        android:gravity="center"
        android:paddingBottom="5dp"
        android:paddingLeft="50dp"
        android:paddingRight="60dp"
        android:paddingTop="5dp"
        android:text="@string/share_header"
        android:textColor="#ffffffff"
        android:textSize="15sp"
        android:textStyle="bold" />
</RelativeLayout>

<ListView
    android:id="@id/android:list"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:background="@color/divider_gray"
    android:cacheColorHint="#00000000"
    android:divider="@color/divider_gray"
    android:dividerHeight="1dp"
    android:footerDividersEnabled="false"
    android:headerDividersEnabled="false" />

<TextView
    android:id="@+id/android:empty"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:text="@string/loading"
    android:textColor="@color/loading_gray"
    android:textSize="20sp" />

</LinearLayout>

Here is more on how the broken one works, just in case you want more code.

Not Working Row XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:layout_weight="1"
android:baselineAligned="false"
android:orientation="vertical"
android:padding="6dp"
android:background="#ffffffff"
android:layout_margin="10dp" >

<TextView
    android:id="@+id/toptext"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_toLeftOf="@id/moreInfo"
    android:gravity="center_vertical"
    android:minHeight="20sp"
    android:textColor="#ff000000"
    android:textStyle="bold" />

</RelativeLayout>

Not Working View Adapter

    @Override
public View getView(int position, View convertView, ViewGroup parent)
{
    ViewHolder holder = null;
    if (convertView == null)
    {
        holder = new ViewHolder();

        LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        convertView = vi.inflate(R.layout.share_row, null);
        convertView.setTag(holder);
    }// if
    else
    {
        holder = (ViewHolder) convertView.getTag();
    }

    v_SitePeople i = items.get(position);

    if (i != null)
    {
        TextView topText = (TextView) convertView.findViewById(R.id.toptext);
        topText.setGravity(Gravity.CENTER_VERTICAL);
        topText.setMinHeight(40);
        if (topText != null)
        {
            if (i.SitePerson != null)
            {
                if (i.PersonTitle != null)
                {
                    topText.setText(String.format(i.SitePerson + ", " + i.PersonTitle));
                }
                else
                {
                    topText.setText(i.SitePerson);
                }
            }// if has ProtocolNumber
            else
            {
                if (i.Nickname != null)
                {
                    topText.setText(i.Nickname);
                }
            }// if does not have ProtocolNumber
        }// if
    }// if
    return convertView;
}// getView

Thank you so much for your help.

Upvotes: 0

Views: 1681

Answers (3)

Franz&#233; Jr.
Franz&#233; Jr.

Reputation: 1194

When you're using a ListView, you have mainly two layouts:

1)The layout where you have your listView

Example:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingTop="?attr/actionBarSize"
    android:clickable="false"
    >

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:background="@android:color/transparent"
        android:clipToPadding="false"
        android:paddingLeft="@dimen/list_left_padding"
        android:paddingRight="@dimen/list_right_padding"
        android:paddingTop="@dimen/list_separator"
        android:dividerHeight="@dimen/list_separator"
        android:paddingBottom="@dimen/list_separator" />


</RelativeLayout>

2)The layout which contains each item for your ListView.

Example:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/white_responsive"
    android:descendantFocusability="blocksDescendants"
    >

    <RelativeLayout
        android:id="@+id/sampleItem"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginTop="3dp"
        android:clipToPadding="false">

            <com.devspark.robototextview.widget.RobotoTextView
                android:id="@+id/textViewSample"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:paddingBottom="5dp"
                android:text="Sample Text"
                android:textSize="17sp"
                app:typeface="roboto_regular" />

    </RelativeLayout>
</RelativeLayout>

If you search on StackOverFlow about this problem, you will got the following instructions to solve it:

1) Add

android:descendantFocusability="blocksDescendants" 

to the root of your layout

2) Add

android:clickable="false"
android:focusable="false"

To your item.

You can use these two options separately. The first one have helped me. But, you need to pay attention on where you need to put these attributes in your XML File. Put them in your ITEM layout, not in your ListView Layout. I'm saying this, because I was using that solution, but i was putting on the wrong xml. So, it just pay attention and it will work very well.

Upvotes: 0

erosebe
erosebe

Reputation: 967

I figured it out. I never posted the relavant code, or I'm sure you guys would have found it for me.

My not working adapter had a isEnabled method copied from my functioning adapter that disabled items of type 0. But since my new list is all just one type everything was disabled.

Sorry for the trouble and thank you for your efforts.

Upvotes: 1

Graham Povey
Graham Povey

Reputation: 949

You haven't shown where you initialise your list and adapter, but you need to make sure the onClickListner is set. Something like:

myListView.setOnItemClickListener(this);

edit: 'this' assuming initialization is done in the same class as the click listeners appear.

Upvotes: 0

Related Questions