2010-03-16 22 views
30

Tengo una vista de lista llena de datos. He creado un menú contextual de la vista de lista usando el siguiente código:Android: Cómo encontrar la posición presionada desde el menú contextual

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

Tengo el siguiente método de reemplazo para el control de menú contextual menuitem seleccionado:

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

En este método overrided, ¿cómo podría encontrar el elemento de la vista de lista que se hizo clic?

Gracias de antemano. Atentamente. José

Respuesta

75

Usted puede utilizar el ContextMenu.ContextMenuInfo.

Algo así:

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

también se puede obtener exactamente el View para el cual se visualiza el menú:

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

Muchas gracias. Atentamente. jose – Sosi

+1

información siempre es nula en mi caso ... ¿alguien puede ayudar? Estoy usando gridview. –

+1

Lo tengo trabajando finalmente, estaba usando GridView personalizado en el que el método 'getContextMenuInfo()' no se implementó. He publicado [aquí] (http://vinaybhargav.wordpress.com/2014/07/20/android-floating-context-menu-for-listviewgridview/) en caso de que alguien necesite una muestra. –

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

muchas gracias. Atentamente. Jose – Sosi

+0

intenté esto con recyclerview pero parece que no funciona. cualquier solución? –

0

bien, para resolver el problema nula información **** uso miembro estático y establecer el valor desde la Posición de su titular para guardar el valor en el miembro del método longclick por ejemplo: -

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

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

y su uso en el contexto de selección de material:

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ódigo C#

Cuestiones relacionadas