web-dev-qa-db-fra.com

création d'un menu après un clic long sur une liste

J'ai une vue de liste connectée à une base de données, montrant toutes les entrées. Je souhaite qu'un menu s'affiche si l'utilisateur clique longuement sur un élément de la listview (entrée de la base de données), affichant les options permettant de modifier ou de supprimer l'entrée. Comment puis-je faire ceci.

Jusqu’à présent, j’ai essayé d’utiliser un écouteur onItemLongClick et de porter un toast indiquant l’id de la vue longtemps 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;
}
69
Eriz

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 pour éditer et effacer ou tout ce dont vous avez besoin.

Les actions pour 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 here .

Pour une visite guidée étape par étape ici .

50
7bluephoenix

Vous devez d’abord enregistrer votre menu contextuel dans la vue 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 fichier menu_list.xml (vous devez le placer 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 va aider.

112
Zhar

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
TharakaNirmana

Vous pouvez appeler Activity.openOptionsMenu() dans votre méthode d'élément de clic

vérifiez ici
http://developer.Android.com/reference/Android/app/Activity.html#openOptionsMenu%28%29

2
Michael Shrestha

**

après avoir enregistré votre menu contextuel dans la vue liste

** override onCreateContextMenu Méthode 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 coder pour chaque élément pouvant ê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;
    }
1
Marjan Dn

Un petit mot pour ceux qui ont encore du mal, il y a deux méthodes

registerForContextMenu(list);
unregisterForContextMenu(list);

Assurez-vous de choisir le premier.

0
Saif Hakeem

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

Pour accéder aux données ListItem sélectionnées, utilisez simplement 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
Serge