création d'un menu après un événement de clic long sur une vue de liste

J'ai une vue de liste connectée à une base de données, montrant toutes les entrées. Je veux qu'un menu s'affiche si l'utilisateur clique longuement sur un élément dans listview(entrée de base de données), montrant des options pour modifier ou supprimer l'entrée. comment puis-je faire cela.

Jusqu'à présent, j'ai essayé d'utiliser un écouteur onItemLongClick et un toast montrant l'id de la vue longuement cliquée.

@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
        int position, long id) {

    String res = Long.toString(id);
     Toast toast = Toast.makeText(this, res, Toast.LENGTH_SHORT);
     toast.show();

    return true;
}
61
demandé sur emaillenin 2013-06-20 11:09:53

6 réponses

Au lieu d'utiliser onItemLongClick Vous pouvez utiliser

public void onCreateContextMenu(final ContextMenu menu, 
                    final View v, final ContextMenuInfo menuInfo) {
 ...
}

Où vous configurez les options d'édition et de suppression ou tout ce dont vous avez besoin.

Les actions de l'élément sélectionné dans le menu contextuel peuvent être traitées dans

public boolean onContextItemSelected(final MenuItem item)

Pour plus d'informations sur le menu contextuel voir ici.

Pour un tutoriel étape par étape, visitez ici .

47
répondu 7bluephoenix 2015-01-06 14:44:16

Vous devez d'abord enregistrer votre menu contextuel en mode liste.

lv = (ListView) findViewById(R.id.list_view);
registerForContextMenu(lv);

Ensuite, remplacez simplement les méthodes d'activité.

/**
 * MENU
 */

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
      super.onCreateContextMenu(menu, v, menuInfo);
      if (v.getId()==R.id.list_view) {
          MenuInflater inflater = getMenuInflater();
          inflater.inflate(R.menu.menu_list, menu);
      }
}

@Override
public boolean onContextItemSelected(MenuItem item) {
      AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
      switch(item.getItemId()) {
         case R.id.add:
         // add stuff here
            return true;
          case R.id.edit:
            // edit stuff here
                return true;
          case R.id.delete:
        // remove stuff here
                return true;
          default:
                return super.onContextItemSelected(item);
      }
}

Voici un exemple de menu_list.fichier xml (vous devez mettre le fichier dans le dossier res / menu).

<?xml version="1.0" encoding="utf-8"?>
<menu
  xmlns:android="http://schemas.android.com/apk/res/android">

       <item android:id="@+id/add"
              android:icon="@android:drawable/ic_menu_add"
              android:title="@string/menu_add" />

      <item android:id="@+id/edit"
              android:icon="@android:drawable/ic_menu_edit"
              android:title="@string/menu_edit" />

       <item android:id="@+id/delete"
            android:icon="@android:drawable/my_icon_delete"
             android:title="@string/menu_delete" />

</menu>

J'espère que ça aidera.

105
répondu Zhar 2015-06-22 23:12:08

Une Autre approche:

//Deleted individual cart items
    //on list view cell long press
    cartItemList.setOnItemLongClickListener (new OnItemLongClickListener() {
          @SuppressWarnings("rawtypes")
        public boolean onItemLongClick(AdapterView parent, View view, final int position, long id) {
              final CharSequence[] items = { "Delete" };

                AlertDialog.Builder builder = new AlertDialog.Builder(context);

                builder.setTitle("Action:");
                builder.setItems(items, new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface dialog, int item) {
                        cart = cartList.get(position);
                        db.removeProductFromCart(context, cart);

                        new AlertDialog.Builder(context)
                        .setTitle(getString(R.string.success))
                        .setMessage(getString(R.string.item_removed))
                        .setPositiveButton("Done", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) { 
                                Intent intent = new Intent(CartDetailsActivity.this, HomeScreen.class);
                                startActivity(intent);
                            }
                         })
                         .show();

                    }

                });

                AlertDialog alert = builder.create();

                alert.show();
            //do your stuff here
              return false;
          }
        });
5
répondu TharakaNirmana 2013-12-12 09:25:19

, Vous pouvez appeler Activity.openOptionsMenu() dans votre cliquez méthode item

Vérifier here
http://developer.android.com/reference/android/app/Activity.html#openOptionsMenu%28%29

2
répondu Michael Shrestha 2013-06-20 07:13:03

Utilisez registerForContextMenu (); pour lier le menu contextuel à n'importe quel successeur de vue.

Pour accéder aux données listtitem sélectionnées, utilisez simplement L'AdapterView.AdapterContextMenuInfo. Par exemple:

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo menuinfo = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
    long selectid = menuinfo.id; //_id from database in this case
    int selectpos = menuinfo.position; //position in the adapter
    switch (item.getItemId()) {
    case 1:
        doSomething(selectid);
    break;
    case 2:
        doSomethingElse(selectpos);
    }
    return super.onContextItemSelected(item);
}
0
répondu Serge 2014-02-05 13:48:18

**

Après avoir enregistré votre menu contextuel sur la vue Liste

** remplacer la méthode onCreateContextMenu comme ceci

@Override
    public void onCreateContextMenu(ContextMenu menu,View v, ContextMenu.ContextMenuInfo menuInfo){
        if (v.getId() == R.id.listView){
            AdapterView.AdapterContextMenuInfo info =(AdapterView.AdapterContextMenuInfo)menuInfo;
            MenuItem mnu1=menu.add(0,0,0,"Delete");
            MenuItem mnu2=menu.add(0,1,1,"Share");
        }
    }

Puis codage pour chaque élément qui peut être sélectionné

 @Override
    public boolean onContextItemSelected(MenuItem menuItem){
        AdapterView.AdapterContextMenuInfo info=(AdapterView.AdapterContextMenuInfo)menuItem.getMenuInfo();
        switch (menuItem.getItemId()) {
            case 0:
                Toast.makeText(this, "Delete Selected", Toast.LENGTH_LONG).show();
                break;
            case 1:
                Toast.makeText(this, "Share Selected", Toast.LENGTH_LONG).show();
                break;

            default:
                break;

        }
        return true;
    }
0
répondu Marjan Dn 2016-12-31 17:40:18