Ich habe eine Listenansicht, die mit einer Datenbank verbunden ist und alle Einträge anzeigt. Ich möchte, dass ein Menü angezeigt wird, wenn der Benutzer lange auf ein Element in der Listenansicht (Datenbankeintrag) klickt und Optionen zum Bearbeiten oder Löschen des Eintrags anzeigt. Wie kann ich das machen.
Bis jetzt habe ich versucht, einen onItemLongClick-Listener und einen Toast darin zu verwenden, der die ID der Ansicht anzeigt, auf die lange geklickt wurde.
@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;
}
Anstelle von onItemLongClick
können Sie verwenden
public void onCreateContextMenu(final ContextMenu menu,
final View v, final ContextMenuInfo menuInfo) {
...
}
hier legen Sie die Optionen für das Bearbeiten und Löschen fest.
Die Aktionen für das aus dem Kontextmenü ausgewählte Element können in verarbeitet werden
public boolean onContextItemSelected(final MenuItem item)
Weitere Informationen zum Kontextmenü finden Sie unter hier .
Eine schrittweise Anleitung finden Sie unter hier .
Zuerst müssen Sie Ihr Kontextmenü in der Listenansicht registrieren.
lv = (ListView) findViewById(R.id.list_view);
registerForContextMenu(lv);
Überschreiben Sie dann einfach die Aktivitätsmethoden.
/**
* 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);
}
}
Hier ist ein Beispiel für die Datei menu_list.xml (Sie müssen die Datei im Ordner res/menu ablegen).
<?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>
Hoffe, es wird helfen.
Ein anderer Ansatz:
//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;
}
});
Sie können Activity.openOptionsMenu()
in Ihrer Klick-Item-Methode aufrufen
überprüfe hier
http://developer.Android.com/reference/Android/app/Activity.html#openOptionsMenu%28%29
**
nachdem Sie Ihr Kontextmenü in der Listenansicht registriert haben
** onCreateContextMenu überschreiben Methode wie diese
@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");
}
}
dann Kodierung für jedes Element, das ausgewählt werden kann
@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;
}
Ein kurzer Hinweis für diejenigen, die noch Probleme haben, es gibt zwei Methoden
registerForContextMenu(list);
unregisterForContextMenu(list);
Stellen Sie sicher, dass Sie die erste auswählen.
Verwenden Sie registerForContextMenu (); Kontextmenü mit einem beliebigen View-Nachfolger verknüpfen.
Um auf ausgewählte ListItem-Daten zuzugreifen, verwenden Sie einfach AdapterView.AdapterContextMenuInfo. Z.B.:
@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);
}