Erstellen eines Menüs nach einem langen Klickereignis in einer Listenansicht

70

Ich habe eine Listenansicht, die mit einer Datenbank verbunden ist und alle Einträge anzeigt. Ich möchte, dass ein Menü angezeigt wird, wenn der Benutzer lange auf ein Element in der Listenansicht (Datenbankeintrag) klickt und Optionen zum Bearbeiten oder Löschen des Eintrags anzeigt. Wie kann ich das machen.

Bis jetzt habe ich versucht, einen onItemLongClick-Listener und einen Toast darin zu verwenden, der die ID der Ansicht anzeigt, auf die lange geklickt wurde.

@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;
}
Eriz
quelle

Antworten:

50

Anstatt zu verwenden onItemLongClick, können Sie verwenden

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

Hier richten Sie die Optionen zum Bearbeiten und Löschen ein oder was auch immer Sie benötigen.

Die Aktionen für das im Kontextmenü ausgewählte Element können in verarbeitet werden

public boolean onContextItemSelected(final MenuItem item)

Weitere Informationen zum Kontextmenü finden Sie hier .

Eine Schritt-für-Schritt-Anleitung finden Sie hier .

7bluephoenix
quelle
2
Ich habe versucht, oncreateContextMenu zu verwenden, und es funktioniert bis jetzt für mich. Danke
Eriz
114

Zuerst müssen Sie Ihr Kontextmenü in der Listenansicht registrieren.

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

Überschreiben Sie dann einfach die Aktivitätsmethoden.

/**
 * 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);
      }
}

Hier ist ein Beispiel für die Datei menu_list.xml (Sie müssen die Datei im Ordner res / menu ablegen).

<?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>

Hoffe es wird helfen.

Zhar
quelle
Danke, es funktioniert, aber woher weiß ich, auf welches Element in der Liste lange geklickt wurde? Irgendein Ausweis?
Enriqe
16
OK, ich habe es gefunden. Sie können ID oder POSITION des Listenelements erhalten, auf das lange geklickt wurde: ((AdapterView.AdapterContextMenuInfo)menuInfo).id ((AdapterView.AdapterContextMenuInfo)menuInfo).position
Enriqe
Die switch-Anweisung funktioniert nicht mehr, da Werte wie R.id.add nicht mehr als Konstanten generiert werden. Daher musste ich den Schalter durch if-else stmt ersetzen!
Mvsagar
3
Tolles Beispiel, aber Symbole werden in Kontextmenüs nicht unterstützt
Dave
1
Hey, Sie haben Symbole für das Menü eingerichtet, aber es gibt keine Symbole im Menü. Warum? Wie kann ich Symbole anzeigen?
Sharikov Vladislav
6

Ein anderer Ansatz:

//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;
          }
        });
TharakaNirmana
quelle
2

Sie können Activity.openOptionsMenu()Ihre Klickelementmethode aufrufen

Überprüfen Sie hier
http://developer.android.com/reference/android/app/Activity.html#openOptionsMenu%28%29

Michael Shrestha
quelle
Wenn Sie das Optionsmenü verwenden können - dies ist eine nette Lösung (1 Zeile!) Und eine Alternative zu allen Einstellungen, die für ein Kontextmenü außerhalb der Aktivität erforderlich sind
Gene Bo
1

** **.

Nachdem Sie Ihr Kontextmenü in der Listenansicht registriert haben

** überschreibe die onCreateContextMenu-Methode wie folgt

@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");
        }
    }

dann Codierung für jedes Element, das ausgewählt werden kann

 @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;
    }
Marjan Davodinejad
quelle
0

Verwenden Sie registerForContextMenu (); um das Kontextmenü mit einem beliebigen View-Nachfolger zu verknüpfen.

Verwenden Sie einfach die AdapterView.AdapterContextMenuInfo, um auf ausgewählte ListItem-Daten zuzugreifen. Z.B:

@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);
}
Serge
quelle
0

Ein kurzer Hinweis für diejenigen, die immer noch Probleme haben: Es gibt zwei Methoden

registerForContextMenu(list);
unregisterForContextMenu(list);

Stellen Sie sicher, dass Sie die erste auswählen.

Saif Hakeem
quelle