Du bist nicht angemeldet.

ensacom

Droid

  • »ensacom« ist der Autor dieses Themas

Beiträge: 37

Level: 24 [?]

Erfahrungspunkte: 66 499

Nächstes Level: 79 247

  • Private Nachricht senden

1

23.05.2009, 08:14

Wie onContextItemSelected mit onListItemClick verbinden?

Hallo, ich habe eine Liste mit Einträgen aus einer Datenbank.
Wenn ich auf einen EIntrag klicke wird die ID des Eintrages aus der Datenbank an eine andere activity übergeben.

Nun habe ich der Liste ein ContextMenü zugewiesen über das ich den gewählten Eintrag schnell löschen will.

Wie kann ich nun erreichen, dass ich über das ContextMenü auf die id des gewählten Eintrages gelange?

onListItemClick bietet mir ja direkt die Variable id, bei onContextItemSelected gibt es das natürlich nicht.

Wie komme ich also über das ContextMenü an die id des gewählten Eintrages der Liste?

Danke
HTC-Magic white
Development: Eclipse Ganymede + Android SDK 1.5
Linux Mint 6

th0br0

Droideka

Beiträge: 18

Modell: T-Mobile G1 Schwarz

Android: Fedora

Wohnort: Dreieich

Level: 21 [?]

Erfahrungspunkte: 32 457

Nächstes Level: 38 246

  • Private Nachricht senden

2

24.05.2009, 11:58

RE: Wie onContextItemSelected mit onListItemClick verbinden?

Hallo,
das spontanste was mir hierzu einfällt ist folgendes Vorgehen:
1. Du wirst ja die ganzen Einträge in einer Liste o.ä. gespeichert haben
2. Du weißt ja, was angeklickt wurde

Also -->
Einfach eine for / while Schleife schreiben, die durch die ganze Liste durchgeht und wenn sie bei unserem Objekt angelangt ist haben wir auch die id...

Jetzt stellt sich natürlich nur das Problem, dass wenn wir die zweimal Ändern, die ID nicht mehr korrekt ist.
Also einfach ne extra Klasse erstellen, die halt den String und die ID verwaltet o.ä.

Oder, solltest du zwei getrennte Listen haben (einmal mit dem was angezeigt wird und einmal mit allem was ausgelesen wurde)
erübrigt sich ja das mit dem extra Klasse erstellen; dann musst du das einfach nur vergleichen

So würde ich es zumindest spontan lösen.

ensacom

Droid

  • »ensacom« ist der Autor dieses Themas

Beiträge: 37

Level: 24 [?]

Erfahrungspunkte: 66 499

Nächstes Level: 79 247

  • Private Nachricht senden

3

28.05.2009, 11:24

RE: Wie onContextItemSelected mit onListItemClick verbinden?

Also ich habe es nun endlich hinbekommen meine ListView mit dem Contextmenü zu verbinden so dass ich auch die ID aus der DB über den gewählten Eintrag in der ListView meinem ContextMenü übergeben kann.

[size=large]fahrzeuge.java[/size]
Daten aus der Datenbank in eine ListView laden.
ContextMenü mit ListView verbinden.


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
final static String MY_DB_NAME = "TankPro2";
final static String MY_DB_TABLE = "fahrzeuge";
final static String tag="ensacom"; 

private static final int COLUMN_INDEX_TITLE = 1; //Titel des Contextmenüs

public static final int EDIT_ID = Menu.FIRST;
public static final int DELETE_ID = Menu.FIRST + 1;
public static final int TANKEN_ID = Menu.FIRST + 2;

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
    
  SQLiteDatabase myDB = null;
  try{
    myDB = this.openOrCreateDatabase(MY_DB_NAME, MODE_PRIVATE, null);
    Cursor c = myDB.rawQuery("SELECT _id, name || ', ' || model as bezeichnung,
                                                           tankinhalt FROM " + 
                                                           MY_DB_TABLE, null);
    startManagingCursor(c);    
    
    getListView().setOnCreateContextMenuListener(this);
	      	
    final SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
	        		R.layout.fahrzeuge, 
	        		c,
	        		new String[] { "_id" },
	        		new int[] { R.id.KfzNameModel });
	          
    adapter.setViewBinder(new ViewBinder() 
    {	           
      @Override
      public boolean setViewValue(View view, Cursor theCursor, int column) 
      {
        final String ColNameModel = theCursor.getString(1); //Name und Model
	((TextView)view).setText(ColNameModel);
	return true;
      }
    });
    this.setListAdapter(adapter);
    } finally {
            if (myDB != null)
            	myDB.close();
    }
  }



ContextMenü erstellen und den Cursor auf die AdapterView der ListView setzen um an die ID des selektierten Eintrages zu gelangen.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    	AdapterView.AdapterContextMenuInfo info;
        try {
             info = (AdapterView.AdapterContextMenuInfo) menuInfo;
        } catch (ClassCastException e) {
            Log.e(TankPro2.tag, "bad menuInfo", e);
            return;
        }

        Cursor cursor = (Cursor) getListAdapter().getItem(info.position);
        if (cursor == null) {
            // For some reason the requested item isn't available, do nothing
            return;
        }

        menu.setHeaderTitle(cursor.getString(COLUMN_INDEX_TITLE));

        menu.add(0, EDIT_ID, 0, R.string.cmEdit);
        menu.add(0, DELETE_ID, 0, R.string.cmDelete);
        menu.add(0, TANKEN_ID, 0, R.string.cmTanken);
    }



Aktion beim anklicken eines Menüpunktes im Contextmenü

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public boolean onContextItemSelected(MenuItem item) {		
		AdapterView.AdapterContextMenuInfo info;
        try {
             info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        } catch (ClassCastException e) {
            Log.e(TankPro2.tag, "bad menuInfo", e);
            return false;
        }
		
		switch (item.getItemId()) {
    		case EDIT_ID:
    			Log.v(TankPro2.tag, "Edit KFZ with id: "+""+info.id); 
    			return true;
    		case DELETE_ID:
    			Log.v(TankPro2.tag, "Delete KFZ with id: "+""+info.id);
    			return true;
    		case TANKEN_ID:
    			Log.v(TankPro2.tag, "fuel KFZ with id: "+""+info.id);
    		default:
    			return super.onContextItemSelected(item);
    		}
    	}


[size=large]fahrzeuge.xml[/size]

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

	<TextView 
  		android:id="@+id/KfzNameModel"
       	        android:layout_width="fill_parent"
            	android:layout_height="wrap_content"
        	android:padding="10px" 
        	android:textStyle="bold" android:textSize="24px">
	</TextView>

</LinearLayout>




[size=large]Hier ein paar Screenshots.[/size]
Startbildschirm mit 3 gespeicherten Fahrzeugen

[attachment=17]

ContextMenü auf dem der Audi TT gewählt wurde und der ContextMenüPunkt Löschen angeklickt wird.

[attachment=18]

Startbildschirm nachdem der Audi TT gelöscht wurde.

[attachment=19]
»ensacom« hat folgende Bilder angehängt:
  • tankpro1_1.png
  • tankpro1_2.png
  • tankpro1_3.png
HTC-Magic white
Development: Eclipse Ganymede + Android SDK 1.5
Linux Mint 6

Anzeige

deni100

Droid

Beiträge: 1

Modell: Samsung Galaxy Note

Android: 2.3.6

Level: 9 [?]

Erfahrungspunkte: 796

Nächstes Level: 1 000

  • Private Nachricht senden

4

14.02.2012, 11:21

Ich kriege bei Eclipse "TankPro2.tag"rot angestrichen , wieso ?

Thema bewerten

Sponsored Content

x86-Version von JavaCV für Android
Dieser Artikel enthält Verweise zu x86-Versionen von JavaCV-Paketen, erklärt aber auch, wie du mit den üblichen Build-Tools (GCC, Make usw.) und Maven eigene Versionen erstellen und zu einer Anwendung hinzufügen kannst.

Jetzt mehr erfahren

Anzeigen

Social-Media