34

I'm working with a ListFragment and doing a onListItemClick. Everything works fine, but now I want to use a long Item Click (e.g setOnItemLongClickListener(new OnItemLongClickListener() for an Activity). How can I use this in my fragment?

Thanks!

tsync
  • 2,387
  • 4
  • 17
  • 15
  • 3
    I found the way: getListView().setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView> paramAdapterView, View paramView, int position, long paramLong) { //TODO return true; } }); – tsync Jul 18 '11 at 13:14

3 Answers3

60

Yes, the solution posted by tsync works for me. I too had ran into same problem and considered that this is not possible. I tried the above suggestion as follows:

public  class ProjectsFragment extends ListFragment {

@Override
public void onActivityCreated(Bundle savedState) {
    super.onActivityCreated(savedState);

    getListView().setOnItemLongClickListener(new OnItemLongClickListener() {

        @Override
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            Toast.makeText(getActivity(), "On long click listener", Toast.LENGTH_LONG).show();
            return true;
        }
    });

and it worked!

Narayanan
  • 3,736
  • 2
  • 19
  • 24
13

Depending on what you want to realize you can use the given methods for context menues:

First register the View class which gets long pressed (inside your Fragment class):

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

    registerForContextMenu(this.getListView());
}

Than implement these two methods, to create a context menu and do what ever you want when a menu item is clicked:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);

    MenuInflater inflater = this.getActivity().getMenuInflater();
    inflater.inflate(R.menu.my_context_menu, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {

    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
    switch (item.getItemId()) {

        case R.id.add: // <-- your custom menu item id here
            // do something here
            return true;

        default:
            return super.onContextItemSelected(item);
    }
}
Matthias B
  • 5,523
  • 3
  • 45
  • 47
  • 4
    Nice! Just want to add that you can't combine registerForContextMenu with setOnItemLongClickListener. May be obvious to some, but not for me. Also it's good to know that the row id can be retrieved from info.id – Toydor Jun 15 '13 at 08:09
  • Today first time I've upped every answer because this was what I was going to do with the longclick event. – danny117 May 29 '14 at 01:28
11

This works for me

getListView().setOnItemLongClickListener(new OnItemLongClickListener() {
    public boolean onItemLongClick(AdapterView<?> av, View v, int position, long id) {
        //Get your item here with the position                   
        return true;
    }
});
Bill Lynch
  • 80,138
  • 16
  • 128
  • 173
NathofGod
  • 479
  • 5
  • 12