2010-03-16 7 views
30

Ich habe eine Listenansicht mit Daten gefüllt. Ich habe ein Kontextmenü für die Listenansicht mit dem folgenden Code auf:Android: So finden Sie die Position aus dem Kontextmenü geklickt

list.setOnCreateContextMenuListener 
(
    new View.OnCreateContextMenuListener() 
    { 
     public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) 
     { 
     AdapterContextMenuInfo mi =(AdapterContextMenuInfo) menuInfo; 
     menu.add(0, 0, 0, "Delete item");     
    } 
    } 
); 

ich die folgende Methode überschreiben müssen, um steuern de contextmenu menuitem ausgewählt:

@Override 
public boolean onContextItemSelected(MenuItem item) 
{ 
    switch(item.getItemId()) 
    { 
    case 0: 
    ShowAlert("hello from delete item"); 
    break; 
    default: 
    return super.onContextItemSelected(item); 
    } 
    return true; 
} 

In dieser overrided Methode, wie kann ich finden das Element der Listenansicht, auf das geklickt wurde?

Vielen Dank im Voraus. Beste Grüße. Jose

Antwort

75

können Sie die ContextMenu.ContextMenuInfo verwenden.

So etwas:

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
    int index = info.position; 
} 

können Sie erhalten auch die genaue View, für die das Menü angezeigt wird:

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
    int index = info.position; 
    View view = info.targetView; 
} 
+0

Vielen Dank. Beste Grüße. jose – Sosi

+1

info ist in meinem fall immer null .. kann jemand helfen? Ich verwende Gridview. –

+1

Ich habe es endlich funktioniert, ich verwendete benutzerdefinierte GridView, in denen 'getContextMenuInfo()' Methode wurde nicht implementiert. Ich habe [hier] (http://vinaybhargav.wordpress.com/2014/07/20/android-floating-context-menu-for-listviewgridview/) veröffentlicht, falls jemand eine Probe braucht. –

3
private static final int EDIT_ID = Menu.FIRST + 3; 
private static final int DELETE_ID = Menu.FIRST + 4; 
@Override 
    public void onCreateContextMenu(ContextMenu menu, View v, 
      ContextMenu.ContextMenuInfo menuInfo) { 
     menu.add(Menu.NONE, EDIT_ID, Menu.NONE, "Edit").setAlphabeticShortcut(
       'e'); 
     menu.add(Menu.NONE, DELETE_ID, Menu.NONE, "Delete") 
       .setAlphabeticShortcut('d'); 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
     AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item 
       .getMenuInfo(); 
     switch (item.getItemId()) { 
     case EDIT_ID: 

      edit(info.id); 
      return (true); 
     case DELETE_ID: 

      delete(info.id); 
      return (true); 
     } 

     return (super.onOptionsItemSelected(item)); 
    } 
+0

Vielen Dank. Beste Grüße. Jose – Sosi

+0

Ich versuchte dies mit Recyclerview, aber es scheint nicht zu funktionieren. irgendeine Problemumgehung? –

0

OK, Problem info null **** Verwendung zu lösen statisches Element und setzen Sie den Wert von Position Ihres Halters , um den Wert in LongClick-Methode Mitglied zum Beispiel zu speichern: -

public class CurrentPosition { 
    public static int Pos{ get; set; } 
} 

public bool OnLongClick(View v) 
{ 
    CurrentPosition.Pos = Position; 
    return false; 
} 

und Verwendung in Ihrem Kontext wählen Sie den Punkt:

public override bool OnContextItemSelected(IMenuItem item) 
{ 
    switch (item.ItemId) 
    { 
     case 0: 
      return true; 
     case 1: 
      Toast.MakeText(this,CurrentPosition.Pos.ToString(), ToastLength.Long).Show(); 
      return true; 
     case 2: 
      Toast.MakeText(this, "Save", ToastLength.Long).Show(); 
      return true; 
     } 
     return true; 
    } 
} 

C# -Code

Verwandte Themen