J'ai une vue de liste connectée à une base de données, montrant toutes les entrées. Je souhaite qu'un menu s'affiche si l'utilisateur clique longuement sur un élément de la listview (entrée de la base de données), affichant les options permettant de modifier ou de supprimer l'entrée. Comment puis-je faire ceci.
Jusqu’à présent, j’ai essayé d’utiliser un écouteur onItemLongClick et de porter un toast indiquant l’id de la vue longtemps 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;
}
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 pour éditer et effacer ou tout ce dont vous avez besoin.
Les actions pour 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 here .
Pour une visite guidée étape par étape ici .
Vous devez d’abord enregistrer votre menu contextuel dans la vue 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 fichier menu_list.xml (vous devez le placer 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 va aider.
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 méthode d'élément de clic
vérifiez ici
http://developer.Android.com/reference/Android/app/Activity.html#openOptionsMenu%28%29
**
après avoir enregistré votre menu contextuel dans la vue liste
** override onCreateContextMenu Méthode 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 coder pour chaque élément pouvant ê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;
}
Un petit mot pour ceux qui ont encore du mal, il y a deux méthodes
registerForContextMenu(list);
unregisterForContextMenu(list);
Assurez-vous de choisir le premier.
Utilisez registerForContextMenu (); pour lier le menu contextuel à n’importe quel successeur de View.
Pour accéder aux données ListItem sélectionnées, utilisez simplement 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);
}