2013-06-20 6 views
52

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 auf ein Element in der Listenansicht (Datenbankeintrag) klickt und Optionen zum Bearbeiten oder Löschen des Eintrags anzeigt. Wie kann ich das machen.Erstellen eines Menüs nach einem Ereignis mit langem Klick in einer Listenansicht

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

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

Antwort

44

Statt onItemLongClick verwenden Sie

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

wo Sie Setup die Optionen für die Bearbeitung verwenden können und lösche oder was immer du brauchst.

Die Aktionen für das Element aus dem Kontextmenü ausgewählt werden, in

public boolean onContextItemSelected(final MenuItem item) 

Weitere Informationen über Kontextmenü sehen here verarbeitet werden.

Für eine Schritt für Schritt Anleitung besuchen Sie here.

+1

ich oncreateContextMenu versucht mit, und es ist für mich arbeiten bis jetzt .. Danke – Eriz

97

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

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

Dann überschreiben Sie einfach die Aktivitätsmethoden.

Hier ist ein Beispiel der Datei menu_list.xml (Sie müssen die Datei in den Ordner res/menu legen).

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

Ich hoffe, es wird helfen.

+0

Danke, es funktioniert, aber woher weiß ich, welches Element in der Liste langgeklickt wurde? Irgendeine ID? – Enriqe

+10

OK, ich habe es gefunden. Sie können ID oder die Position des Listeneintrag erhalten, die wie folgt longclicked wurde: '((AdapterView.AdapterContextMenuInfo) MenuInfo) .id' ' ((AdapterView.AdapterContextMenuInfo) MenuInfo) .position' – Enriqe

+0

switch-Anweisung funktioniert nicht mehr als Werte wie R.id.add werden nicht mehr als Konstanten generiert. Daher musste ich Switch durch if-else stmt ersetzen! – mvsagar

5

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

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

Um auf ausgewählte ListItem-Daten zuzugreifen, verwenden Sie einfach die AdapterView.AdapterContextMenuInfo. Zum Beispiel:

@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

**

nach dem Kontextmenü auf Listenansicht

** Überschreibung onCreateContextMenu Methode wie diese

@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 registrieren das kann ausgewählt werden

@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; 
    } 
Verwandte Themen