2013-06-20 12 views
52

我有一個連接到數據庫的列表視圖,顯示了所有條目。我想要一個菜單​​來顯示用戶是否長時間點擊列表視圖(數據庫條目)中的一個項目,顯示編輯或刪除條目的選項。我怎樣才能做到這一點。直到現在,我已經嘗試使用onItemLongClick監聽器,並在其中顯示長時間點擊的視圖的ID。在列表視圖上長按單擊事件後創建菜單

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

回答

44

而不是使用onItemLongClick,你可以使用

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

,你設置的編輯選項並刪除或任何你需要的。

從上下文菜單中所選擇的該項目的動作可以按

public boolean onContextItemSelected(final MenuItem item) 

被處理對於上下文菜單中看到here更多信息。

對於一步一步教程訪問here

+1

的所有設置,它是爲我工作到現在.. 謝謝 – Eriz

97

首先,您需要在列表視圖中註冊您的上下文菜單。

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

然後,只需重寫活動方法。

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

這裏是menu_list.xml文件的示例(您必須將文件放在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> 

希望它能幫上忙。

+0

謝謝,它的工作原理,但我怎麼知道列表中的哪個項目是長按?任何ID? – Enriqe

+10

好的,我找到了。你可以得到像這樣長按的列表項的ID或POSITION: '((AdapterView.AdapterContextMenuInfo)menuInfo).id' '(((AdapterView.AdapterContextMenuInfo)menuInfo).position' – Enriqe

+0

switch語句不再作爲像R.id.add這樣的值不再生成爲常量。因此我需要用if-else stmt替換switch! – mvsagar

5

的另一種方法:

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

使用registerForContextMenu();將上下文菜單鏈接到任何View後繼。

要訪問選定的ListItem數據,只需使用AdapterView.AdapterContextMenuInfo即可。 例如:

@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

**

註冊您的上下文菜單列表視圖

** 覆蓋onCreateContextMenu法這樣

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

之後再編碼爲每個項目可以選擇

@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; 
    } 
相關問題