2013-06-20 11 views
52

Mam widok listy połączony z bazą danych, pokazujący wszystkie wpisy. Chcę, aby menu wyświetlało się, jeśli użytkownik długo klika element w widoku listy (wpis w bazie danych), pokazując opcje edycji lub usunięcia wpisu. jak mogę to zrobić.tworzenie menu po długim kliknięciu w widoku listy

Do tej pory próbowałem używać odbiornika onItemLongClick i toastu w nim, pokazując identyfikator długo klikniętego widoku.

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

Odpowiedz

44

Zamiast onItemLongClick można użyć

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

gdzie można skonfigurować opcje edycji i usuń lub cokolwiek potrzebujesz.

Działania dla wybranej pozycji z menu kontekstowego mogą być przetwarzane w

public boolean onContextItemSelected(final MenuItem item) 

Więcej informacji na temat menu kontekstowego zobaczyć here.

Aby przejść do samouczka, odwiedź stronę here.

+1

Próbowałem przy użyciu oncreateContextMenu, i pracuje dla mnie do tej pory .. Dziękujemy – Eriz

97

Najpierw musisz zarejestrować swoje menu kontekstowe w widoku listy.

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

Następnie wystarczy przesłonić metody działania.

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

Oto przykład pliku menu_list.xml (trzeba umieścić plik w folderze 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> 

Mam nadzieję, że pomoże.

+0

Dzięki, działa, ale skąd mam wiedzieć, która pozycja na liście była długoklikliwa? Dowolny identyfikator? – Enriqe

+10

OK, znalazłem to. Możesz uzyskać ID lub POZYCJĘ elementu listy, który był długo kliknięty w ten sposób: '((AdapterView.AdapterContextMenuInfo) menuInfo) .id' ' ((AdapterView.AdapterContextMenuInfo) menuInfo) .pozycja' – Enriqe

+0

instrukcja switch nie działa już jako wartości takie jak R.id.add nie są już generowane jako stałe. Dlatego musiałem wymienić przełącznik na if-else stmt! – mvsagar

5

Innym podejściem:

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

Zastosowanie registerForContextMenu(); połączyć menu kontekstowe z dowolnym następcą widoku.

Aby uzyskać dostęp do wybranych danych ListItem, wystarczy użyć AdapterView.AdapterContextMenuInfo. E.g.:

@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

**

po zarejestrować swoje menu kontekstowe na widoku listy

** override onCreateContextMenu metody takie jak to

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

następnie kodowanie dla każdej pozycji które można wybrać

@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; 
    } 
Powiązane problemy