Get the position of a button clicked in ListView

331 views Asked by At

I have a fragment where when an item of the list is clicked, you can determine which position using onListItemClick. Now I have a button on each list item (a delete button) and I want to know which position was clicked when it is pressed. How can I do this? it seems like the onClick method for the button has to be in a different Activity so I don't know how I can know which position of it was clicked. Here is the fragment code:

public class MapListFragment extends ListFragment implements
        LoaderManager.LoaderCallbacks<Cursor> {

    private static final int LOADER_ID = 1;
    private static final String[] FROM = { Database.Maps.DATA,
            Database.Maps.NAME };
    private static final String[] CURSOR_COLUMNS = { Database.Maps.ID,
            Database.Maps.DATA, Database.Maps.NAME };
    private static final int[] TO = { R.id.li_map_image, R.id.li_map_name };

    private SimpleCursorAdapter mAdapter;

    // FIXME isn't this unnecessary?
    public MapListFragment() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // FIXME reverse the order so the newest sessions are at the top
        mAdapter = new SimpleCursorAdapter(getActivity(),
                R.layout.map_list_item, null, FROM, TO, 0);
        mAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
            @Override
            public boolean setViewValue(View view, Cursor cursor,
                    int columnIndex) {
                if (view.getId() == R.id.li_map_image) {
                    ((ImageView) view).setImageURI(Uri.parse(cursor
                            .getString(columnIndex)));
                    return true;
                }
                return false;
            }
        });
        setListAdapter(mAdapter);

        getLoaderManager().initLoader(LOADER_ID, null, this);
    }

    @Override
    public void onListItemClick(ListView list, View v, int position, long id) {
        final Intent nextIntent = new Intent(getActivity(),
                ViewMapActivity.class);
        nextIntent.putExtra(Utils.Constants.MAP_ID_EXTRA, id);
        startActivity(nextIntent);
    }


    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        return new CursorLoader(getActivity(), DataProvider.MAPS_URI,
                CURSOR_COLUMNS, null, null, null);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        if (loader.getId() == LOADER_ID)
            mAdapter.swapCursor(cursor);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        mAdapter.swapCursor(null);
    }

}

and the 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="50dp"
    android:descendantFocusability="blocksDescendants"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/li_map_image"
        android:layout_width="50dp"
        android:layout_height="match_parent"
        android:contentDescription="thumbnail" />

    <TextView
        android:id="@+id/li_map_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_weight="1"
        android:paddingLeft="8dp"
        android:textSize="16sp" />


    <ImageButton
        android:layout_width="60dp"
        android:layout_height="match_parent"
        android:id="@+id/delete"
        android:focusableInTouchMode="true"
        android:background="@drawable/red_x"
        android:layout_gravity="center|left"
        android:onClick="deleteMap"/>



</LinearLayout>
2

There are 2 answers

2
Tyler Kiser On BEST ANSWER

You should be able to get the parent of the ImageButton inside the ImageButton click handler. Assuming you add each button listener inside the list item creation for the adapter

ImageButton btn_image = (ImageButton) itemview.findViewById(R.id.delete);
btn_image.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        View parentItem = view.getParent();
    }
});

Where itemview is the inflated view in the getView method of your list adapter.

You have a rather complicated need for an simple adapter. Take a look at this tutorial http://www.vogella.com/tutorials/AndroidListView/article.html#adapterown where he walks you through making your own custom adapter. You'll see the "getView" method inside the custom list view adapter. This is where you setup each list item and would add the button.

0
christoandrew On

First you can put a hidden field in the list item so that when you click. From the view you can find this field (id) and get its value.