Search code examples
androidxmllistviewonitemclicklistenerandroid-tabactivity

Using OnItemClickListener on ListView inside TabActivity


I am having a silly problem with a OnItemCliskListener for my ListView. It works well when the XML is very simple but after I improve its complexity, the OnItemCliskListener stop working

In other words, I have a ListView with just a TextView. But if I turn my ListView into a more complex list with other TextView, an Icon a CheckBox, the ClickListener stop working.

If I run exactly the same code changing just the XML, the OnItemCliskListener stops working. I would be rather grateful if you could help me

WORKING LIST VIEW:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:orientation="vertical"
    android:layout_height="fill_parent">
    <TextView android:id="@+id/title"
        android:layout_height="wrap_content" android:layout_width="wrap_content"
        android:layout_toLeftOf="@+id/appCheck"
        android:layout_toRightOf="@+id/appIcon"
        android:textAppearance="?android:attr/textAppearanceLarge">
    </TextView>
</RelativeLayout>

NOT WORKING LISTVIEW:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:orientation="vertical"
    android:layout_height="fill_parent">
    <ImageView android:src="@drawable/icon" android:id="@+id/appIcon"
        android:layout_width="30px" android:layout_height="40px"></ImageView>
    <CheckBox android:id="@+id/appCheck"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:layout_alignParentRight="true"></CheckBox>
    <TextView android:id="@+id/title"
        android:layout_height="wrap_content" android:layout_width="wrap_content"
        android:layout_toLeftOf="@+id/appCheck"
        android:layout_toRightOf="@+id/appIcon"
        android:textAppearance="?android:attr/textAppearanceLarge">
    </TextView>
    <TextView android:id="@+id/subtitle"
        android:layout_height="wrap_content" android:layout_width="wrap_content"
        android:layout_toLeftOf="@+id/appCheck"
        android:layout_toRightOf="@+id/appIcon" android:layout_below="@+id/title"
        android:textAppearance="?android:attr/textAppearanceSmall">
    </TextView>
</RelativeLayout>

MY JAVA ACTIVITY:

public class MyTabsActivity extends TabActivity implements OnTabChangeListener {
private static final String LIST3_TAB_TAG = "List3";

private RelativeLayout layoutTab3;      
private MyArrayAdapter adapterListViewTab3;
private TabHost tabHost;
...
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            tabHost = getTabHost();
            tabHost.setOnTabChangedListener(this);
...
...
// ----------------- BUILD TAB3
            // That is my Tab of Running App
            layoutTab3 = (RelativeLayout) findViewById(R.id.running_app_relative_layout);
            // Fill my ListView of Running App
            ListView runningAppList = (ListView) findViewById(R.id.running_app_listview);
            List<String> list3Strings = new ArrayList<String>();
            list3Strings.add("Item 1");
            list3Strings.add("Item 2");
            list3Strings.add("Item 3");
            list3Strings.add("Item 

            adapterListViewTab3 = new MyArrayAdapter(this, android.R.layout.simple_list_item_1, list3Strings);
            runningAppList.setAdapter(adapterListViewTab3);
            // ????????????????????????????????????????????????????????????????????????????????????????????
            // >>>>>>>>>>>> THIS OnItemClickAdapter DOESN'T WORK !!!!! WHY ????????
            runningAppList.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    Toast.makeText(MyTabsActivity.this, "EUREKA", Toast.LENGTH_SHORT).show();
                }
            });

...
// add Tab3
            TabSpec tab3 = tabHost.newTabSpec(LIST3_TAB_TAG).setIndicator(LIST3_TAB_TAG).setContent(new TabContentFactory() {
                public View createTabContent(String arg0) {
                    return layoutTab3;
                }
            });
            tabHost.addTab(tab3);
            layoutTab3.setVisibility(View.INVISIBLE);
...
}
}

MY R.layout.main:

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout android:orientation="vertical"
        android:layout_width="fill_parent" android:layout_height="fill_parent">
        <TabWidget android:id="@android:id/tabs"
            android:layout_width="fill_parent" android:layout_height="wrap_content" />
        <FrameLayout android:id="@android:id/tabcontent"
            android:layout_width="fill_parent" android:layout_height="fill_parent">

            <ListView android:id="@+id/list1" android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:layout_weight="1">
            </ListView>

            <ListView android:id="@+id/list2" android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:layout_weight="1">
            </ListView>

            <RelativeLayout android:id="@+id/running_app_relative_layout"
                android:orientation="vertical" android:layout_width="fill_parent"
                android:layout_height="fill_parent">

                <LinearLayout android:orientation="horizontal"
                    android:id="@+id/coco" android:layout_alignParentTop="true"
                    android:layout_width="fill_parent" android:layout_height="fill_parent">
                    <ListView android:id="@+id/running_app_listview"
                        android:scrollbars="vertical" android:layout_width="fill_parent"
                        android:layout_height="wrap_content" android:layout_gravity="fill_vertical"
                        android:layout_alignParentTop="true"></ListView>
                </LinearLayout>
            </RelativeLayout>

        </FrameLayout>
    </LinearLayout>
</TabHost>

Solution

  • I've figured out that when a custom ListView contains focusable elements, onListItemClick won't work (I think it's the expected behaviour). So I've just removed the focus from the custom view and it did the trick. In other words, I added the following commands to my view:

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

    The full explanation is avaiable here: How to fire onListItemClick in Listactivity with buttons in list?