création d'un menu après un événement de clic long sur une vue de liste
J'ai une vue de liste connectée à une base de données, montrant toutes les entrées. Je veux qu'un menu s'affiche si l'utilisateur clique longuement sur un élément dans listview(entrée de base de données), montrant des options pour modifier ou supprimer l'entrée. comment puis-je faire cela.
Jusqu'à présent, j'ai essayé d'utiliser un écouteur onItemLongClick et un toast montrant l'id de la vue longuement cliquée.
@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;
}
6 réponses
Au lieu d'utiliser onItemLongClick
Vous pouvez utiliser
public void onCreateContextMenu(final ContextMenu menu,
final View v, final ContextMenuInfo menuInfo) {
...
}
Où vous configurez les options d'édition et de suppression ou tout ce dont vous avez besoin.
Les actions de l'élément sélectionné dans le menu contextuel peuvent être traitées dans
public boolean onContextItemSelected(final MenuItem item)
Pour plus d'informations sur le menu contextuel voir ici.
Pour un tutoriel étape par étape, visitez ici .
Vous devez d'abord enregistrer votre menu contextuel en mode liste.
lv = (ListView) findViewById(R.id.list_view);
registerForContextMenu(lv);
Ensuite, remplacez simplement les méthodes d'activité.
/**
* 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);
}
}
Voici un exemple de menu_list.fichier xml (vous devez mettre le fichier dans le dossier 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>
J'espère que ça aidera.
Une Autre approche:
//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;
}
});
, Vous pouvez appeler Activity.openOptionsMenu()
dans votre cliquez méthode item
Vérifier here
http://developer.android.com/reference/android/app/Activity.html#openOptionsMenu%28%29
Utilisez registerForContextMenu (); pour lier le menu contextuel à n'importe quel successeur de vue.
Pour accéder aux données listtitem sélectionnées, utilisez simplement L'AdapterView.AdapterContextMenuInfo. Par exemple:
@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);
}
**
Après avoir enregistré votre menu contextuel sur la vue Liste
** remplacer la méthode onCreateContextMenu comme ceci
@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");
}
}
Puis codage pour chaque élément qui peut être sélectionné
@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;
}