web-dev-qa-db-ja.com

リストビューでの長いクリックイベントの後のメニューの作成

データベースに接続されたリストビューがあり、すべてのエントリが表示されています。ユーザーがリストビュー(データベースエントリ)内のアイテムを長押しするとメニューが表示され、エントリを編集または削除するオプションが表示されます。これどうやってするの。

これまで、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;
}
69
Eriz

onItemLongClickを使用する代わりに、次を使用できます。

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

編集と削除のオプション、または必要なものをセットアップします。

コンテキストメニューから選択されたアイテムのアクションは、で処理できます

public boolean onContextItemSelected(final MenuItem item)

コンテキストメニューの詳細については、 here を参照してください。

ステップごとのチュートリアルについては、 こちら をご覧ください。

50
7bluephoenix

最初に、リストビューでコンテキストメニューを登録する必要があります。

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>

それが役立つことを願っています。

112
Zhar

別のアプローチ:

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

クリック項目メソッドでActivity.openOptionsMenu()を呼び出すことができます

ここで確認してください
http://developer.Android.com/reference/Android/app/Activity.html#openOptionsMenu%28%29

2

**

リストビューでコンテキストメニューを登録した後

**このように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;
    }
1
Marjan Dn

まだ苦労している人のための簡単なメモ、2つの方法があります

registerForContextMenu(list);
unregisterForContextMenu(list);

必ず最初のものを選んでください。

0
Saif Hakeem

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
Serge