データベースに接続されたリストビューがあり、すべてのエントリが表示されています。ユーザーがリストビュー(データベースエントリ)内のアイテムを長押しするとメニューが表示され、エントリを編集または削除するオプションが表示されます。これどうやってするの。
これまで、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;
}
onItemLongClick
を使用する代わりに、次を使用できます。
public void onCreateContextMenu(final ContextMenu menu,
final View v, final ContextMenuInfo menuInfo) {
...
}
編集と削除のオプション、または必要なものをセットアップします。
コンテキストメニューから選択されたアイテムのアクションは、で処理できます
public boolean onContextItemSelected(final MenuItem item)
コンテキストメニューの詳細については、 here を参照してください。
ステップごとのチュートリアルについては、 こちら をご覧ください。
最初に、リストビューでコンテキストメニューを登録する必要があります。
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>
それが役立つことを願っています。
別のアプローチ:
//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;
}
});
クリック項目メソッドでActivity.openOptionsMenu()
を呼び出すことができます
ここで確認してください
http://developer.Android.com/reference/Android/app/Activity.html#openOptionsMenu%28%29
**
リストビューでコンテキストメニューを登録した後
**このように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;
}
まだ苦労している人のための簡単なメモ、2つの方法があります
registerForContextMenu(list);
unregisterForContextMenu(list);
必ず最初のものを選んでください。
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);
}