2013-06-20 13 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を使用して、クリックした項目の方法でActivity.openOptionsMenu()を呼び出すことができますあなたが必要とするものを削除することができます。コンテキストメニューから選択した項目の

アクションはhereを参照して、コンテキストメニューの詳細について

public boolean onContextItemSelected(final MenuItem item) 

で処理することができます。

ステップバイステップチュートリアルhereを参照してください。

+1

オフのcontextMenuに必要なすべての設定を行うには、この素敵な溶液(!1本のライン)と代替私はoncreateContextMenuを使用してみました、そして、それは今まで私のために働いています.. ありがとうございます – 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フォルダに置く必要があります)。

希望します。

+0

ありがとう、それは動作しますが、リスト内のどの項目がlongclickedされたかをどのように知っていますか?すべてのID? – Enriqe

+10

OK、見つけました。 '((AdapterView.AdapterContextMenuInfo)menuInfo).id' '((AdapterView.AdapterContextMenuInfo)menuInfo).position' – Enriqe

+0

switchステートメントはもう機能しません。次のように長さが変更されたリスト項目のIDまたはPOSITIONを取得できます。 R.id.addなどの値は定数として生成されなくなりました。したがって、スイッチをif-else stmtに置き換える必要がありました! – 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()。コンテクストメニューを任意のビューの後続にリンクします。

選択した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

**

この

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

のようなリストビューに

** オーバーライドonCreateContextMenu方法をあなたのコンテキストメニューを登録した後、各項目をコードします選択することができます

@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; 
    } 
関連する問題