Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: Grid view with clickable grid items and nested views (buttons, checkboxes)

Basically, I would like to implement a GridView wherein the items themselves are clickable, but within the GridView are clickable Buttons and Checkboxes.

Here's a sample layout:

Gridview
-----------------------------------------
|[ImageView]        |[ImageView]        |
|[TextView]         |[TextView]         |
|[Button][Checkbox] |[Button][Checkbox] |
-----------------------------------------
|[ImageView]        |[ImageView]        |
|[TextView]         |[TextView]         |
|[Button][Checkbox] |[Button][Checkbox] |
-----------------------------------------

Basically, what i want to do is, when the user clicks the CheckBox, multiple items can now be selected from the GridView. When the users clicks the Button, A Popup is shown. When the user clicks anywhere else, a new Activity is started. The whole point of this is instead of long-pressing to show the context menu, I would like a button to take its place.

Any suggestions on how I can approach this scenario? In my current setup, if I add the Button within the adapter's GetView() method, only the Button is clickable. The whole GridView item is not clickable. When I remove the Button, the GridView item is clickable again. It seems that it's only the whole GridView Item or the Button is clickable (responds to OnClickListener(). Is there a way to make them both clickable?

like image 527
Neilers Avatar asked Dec 13 '22 09:12

Neilers


1 Answers

This post is old, but just for reference/googlers, I have the following solution:

You need to write all the events for buttons, checkboxes in getView of the imageAdapter only. Then in your layout.xml file under the gridview tag add these lines:

android:clickable="true"
android:descendantFocusability="beforeDescendants"

and add these lines to your button and checkboxes:

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

And if you want some other activity to start if any other area of the gridview item is clicked/touched you would need to use the (standard code)/(your own matching implementation):

GridView gridview = (GridView) findViewById(R.id.gridview);
    gridview.setAdapter(new ImageAdapter(this));

    gridview.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            Toast.makeText(HelloGridView.this, "" + position, Toast.LENGTH_SHORT).show();
        }

Cheers, });

like image 106
AliR Avatar answered May 20 '23 02:05

AliR