Click Event auf Listview Datenbank

C

Chris92

Fortgeschrittenes Mitglied
0
Hallo ich hab mir ein Click Event Programmiert auf eine Listview wo ich Daten aus einer Datenbank hineinlade. Doch ich hab ein Problem, wenn ich ein getItemAtPosition mache, krieg ich nicht den Wert der in der Spalte steht wo ich geklickt habe sondern, siehe Anhang. Als Zusatz Information: Die ListView wird nicht immer mit den gleichen Werten geladen, das hängt davon ab was der Benutzer vorher ausgewählt hat.

MFG Chris92
 

Anhänge

  • 0.png
    0.png
    2,2 KB · Aufrufe: 520
Und du hast die Frage gleich in zwei Themen gepostet. ;)

Das ganze liegt daran, dass du in deiner ListView wie du auch geschrieben hast, Daten aus einer Datenbank hast. Diese liegen nun also nicht als Text oder Strings in der ListView sondern als SQLiteCursor (was dein Bild im Anhang auch anzeigt).

SQLiteCursor | Android Developers
 
Ja ich weis, dass ich das gleiche in 2 Posts gepostet hab aber im anderen antwortet glaube niemand so schnell drauf da dieser Post unter einem anderen Thema eröffnet wurde und so dachte ich mir mache ich lieber einen Neuen.
Ich hab mir dein Link angeschaut aber ich fand irgendwie nichts was mir bei meinem Problem behilflich sein könnte. Was hast du dir denn gedacht was mir da weiter helfen könnte

MFG Chris92
 
Hmm und was schreib ich in die Klammer bei cursor.getString(); Sry wenn ich vieleicht so eine dumme Frage stelle aber ich bin noch ein ziemlicher Anfänger auf dem Gebiet Android bzw. SQLLiteDatebase.

MFG Chris92
 
Da kommt der Index der Spalten hin. Wenn du zB eine Datenbank hast mit "Name" und "Alter", dann wäre Name 0 und Alter 1 oder je nachdem in welcher Reihenfolge du die hinzufügst.
 
  • Danke
Reaktionen: Chris92
Ok vielen dank, habs hinbekommen, hier meine Lösung weis zwar nicht ob es die Beste ist aber sie§ funktioniert ;).
Code:
 listView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                      int position, long id) {
                // TODO Auto-generated method stub
                String[] values = { "Tag" };
                Cursor curItem = mDB.query(true, "FTrainingsplan", values, null, null, null, null, null, null);     
                curItem.moveToPosition(position);
                Toast.makeText(FTraining.this,""+curItem.getString(0), Toast.LENGTH_LONG).show();
            }
        });

MFG Chris92
 
Ich hab hier ein Problem aber ich verstehe nicht an was es liegt der Code funktioniert gibt mir auch keine Fehlermeldung wieder. Wenn ich auf eine Übung klicke bekomme ich auch einen Werte wieder doch nicht den richtigen z.B: bekomme ich wenn ich auf wenn ich den ersten Wert in der Listview klicken den 3ten oder wenn ich auf den 4ten klicke bekomme ich den 2ten. Hmm keine Ahnung an was das liegt die Werte les ich ja aus einer festen Datenbank heraus. Hier mein Code:

Code:
 Tage = getIntent().getExtras().getString("Tag");
        initListView("SELECT _id, Übung AS Auswahl FROM FTrainingsplan WHERE Tag = '"+Tage+"'");
        
        /**OnItemClickListener event zuweisen (Funktioniert aber noch nicht) - Anfang*/
        ListView listView = getListView();
        listView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                      int position, long id) {
                // TODO Auto-generated method stub
                /**Wert ermitteln der angeklickt wurde - Anfang*/
                String[] values = { "Übung" };
                //Cursor mit den Werten Laden (In diesem Fall Tag)
                Cursor curItemselect = mDB.query(true, "FTrainingsplan", values, "Tag = '"+Tage+"'" ,null , null, null, null, null);  
                
                //zur Position gehen die angeklickt wurde
                curItemselect.moveToPosition(position); 
                //Wert aus Kolonne 0 auf dieser Position herausnehmen
                String UebungAuswahl = curItemselect.getString(0); 
                Toast.makeText(FTrainingsTage.this,""+UebungAuswahl , Toast.LENGTH_SHORT).show();        
                /**Wert ermitteln der angeklickt wurde - Anfang*/           
            }
        });
 
Hallo,

1. Hast Du mal das SQL Statment überprüft?
2. Funktioniert das -> WHERE Tag = '"+Tage+"'" sicher?!
3. Mach doch mal eine try catch um den Code und gib Dir die Exception aus.

Code:
        try {
                        
            
        }
        catch (Exception ex) {
            TextView textView = (TextView)findViewById(R.id.Ausgabe); 
            textView.setText(ex.toString());
        }
Gruß Bobert
 
Also:
1) Was meinst du damit ob die SQL funktioniert? Wenn ja das geht ja bekomme ja keine Fehlermeldung er zeigt mir nur das falsche an.
2) Der Where Tag funktioniert da ich nur die Übungen angezeigt bekomme die an dem ausgewählten Tag stattfinde.
3) hab den Code zwischen try{ und }catch hinzugefügt bekomme aber nicht angezeigt.

MFG Chris92
 
Hallo,

1. SQL ist das hier " SELECT _id, Übung AS Auswahl FROM FTrainingsplan WHERE Tag = '"+Tage+"'" "

Was steht den in der Datenbank für "Tag" und was für ein DatenTyp ist "Tag" in der Datenbank?

Gruß Bobert
 
Das klappt, er schreibt mir alle Übungen richtig in die Listview hinein die an dem Tag gemacht werden. in Tag steht z.B: Tag 1, Tag 2, Tag 3...


MFG Chris92
 
Hallo,

wenn in der Datenbank Tag 1, Tag 2, Tag 3 steht müsstest Du meinen verständnis nach anstatt "Tag = '"+Tage+"'" -> "Tag '"+Tage+"'" schreiben.

In der Zeile: Cursor curItemselect = mDB.query(true, "FTrainingsplan", values, "Tag = '"+Tage+"'" ,null , null, null, null, null);

Gruß
Bobert
 
Also Tage ist eine Variable wo z.B: Tag 1, Tag 2 drin steht.
Glaub nicht, dass es daran liegt denn ich bekomme ja die Übungen des richtigen Tages angezeigt wenn ich auf einen der Übungen in der ListView klicke bekomme ich auch eine Übung zurück die sich in dem Tag befindet, aber nur nicht die Übung die ich angeklickt habe.


MFG Chris92
 
mmmhh :winki: ok.

Wo und wie ist mDB Deklariert, nur damit ich es ganz nachvollziehen kann.

Gruß Bobert
 
Hier ist der ganze Code von der Activty:

Code:
package lu.projekt.FitnessApp;

import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class FTrainingsTage extends ListActivity {
    
    private SQLiteDatabase mDB = null;
    private SimpleCursorAdapter mAdapter;
    int Count;
    String Tage;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        String path = "/sdcard/Training.db";
        mDB = SQLiteDatabase.openOrCreateDatabase(path, null); 
            
        Tage = getIntent().getExtras().getString("Tag");
        Toast.makeText(FTrainingsTage.this,""+Tage , Toast.LENGTH_SHORT).show();
        initListView("SELECT _id, Übung AS Auswahl FROM FTrainingsplan WHERE Tag = '"+Tage+"'");
        
        /**OnItemClickListener event zuweisen (Funktioniert aber noch nicht) - Anfang*/
        ListView listView = getListView();
        listView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                      int position, long id) {
                // TODO Auto-generated method stub
                /**Wert ermitteln der angeklickt wurde - Anfang*/
                String[] values = { "Übung" };
                //Cursor mit den Werten Laden (In diesem Fall Tag)
                Cursor curItemselect = mDB.query(true, "FTrainingsplan", values, "Tag = '"+Tage+"'" ,null , null, null, null, null);  
                
                //zur Position gehen die angeklickt wurde
                curItemselect.moveToPosition(position); 
                //Wert aus Kolonne 0 auf dieser Position herausnehmen
                String UebungAuswahl = curItemselect.getString(0); 
                Toast.makeText(FTrainingsTage.this,""+UebungAuswahl, Toast.LENGTH_SHORT).show();        
                /**Wert ermitteln der angeklickt wurde - Anfang*/
                
                /**Activity wechseln & Varaible Tag mit übertragen  - Anfang */
                //Intent intent = new Intent(FTrainingsTage.this,FTrainingUebung.class);
                //intent.putExtra("Uebung", UebungAuswahl);
                //startActivity(intent);
                /**Activity wechseln & Varaible Tag mit übertragen  - Ende */
            }
        });

        /**OnItemClickListener event zuweisen (Funktioniert aber noch nicht) - Ende*/
            registerForContextMenu(getListView());
    }
    
    /**Help aufrufen ---------------------------------------*/
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
        Intent intent = new Intent(FTrainingsTage.this,FTrainingUebung.class);
        //intent.putExtra("Uebung", UebungAuswahl);
        startActivity(intent);
    }
 

    /**Edit Test ---------------------------------------*/
       private void initListView(String sql){
        
        // Abfrage erstellen. In cur ist das Ergebnis der Abfrage.
        Cursor cur = mDB.rawQuery(sql, null);
        
        if (cur != null) {
            // Einen Adapter ertellen und der ListView zuweisen..
            startManagingCursor(cur);
            mAdapter = new SimpleCursorAdapter(this, R.layout.listitem, cur,
                    new String[] { "Auswahl" }, new int[] { android.R.id.text1 });
            setListAdapter(mAdapter);
        }    
    }
}

MFG Chris92
 
Keiner eine Ahnung an was das liegen kann? Denn ich habs immer noch nicht herausgefunden :(.

MFG Chris92
 
Hallo Chris92,

meine Empfehlung ist folgende:

Merke dir in der Klasse FTrainigsTage die angeklickte _id und übergebe diese an ein Bündel. Hole dir das Bündel in der Klasse, in der du den Datensatz bearbeiten möchtest. Mache dort eine neue Abfrage und ändere den Datensatz. Möchtest du, dass die Änderung anschließend in der ListView sichtbar wird, brauchst du nur ein Requery auf den Cursor deiner FTraingsTage anzuwenden ( mAdapter.getCursor().requery(); ).

Nochmal:

1) _id in der Hauptactivity (FTraingsTage) merken.
2) Neue Activity zum bearbeiten öffnen
3) Datenbank in der neuen Acitivity öffnen und Abfrage auf die _id machen. Am besten nur ein Datensatz in einen Cursor. Mach danach ein cur.moveToFirst().
4) Datensatz bearbeiten.
5) Activity schließen
6) In der Hauptactivity ein Requery auf den Cursor anwenden, damit die ListView sich neu zeichnet.
7) fertig.

Ich mache das so, damit ich die Activitys mehr oder weniger unabhängig benutzen kann. Das Activity zum bearbeiten kanns du z.B. für eine Neuanlage oder zum editieren verwenden. Ebenfalls auch aus der ListView heraus kannst du diese benutzen. Das einzige was die Activity zum bearbeiten benötigt ist eine _id.

Beispiel:

Klassenvariable einrichten:

Code:
 // Bei einem LongClick die aktuelle Satznummer (_id) merken.
    private long mCurrentRecID = 0;
ich benötige die aktuelle _id bei einem LongKlick. kannste auch auch mit einem einfachen Klick machen

Code:
 // Beim LongClick im Kontextmenü bekomme ich keine ID des gewählten Eintrages.
        listView.setOnItemLongClickListener(new OnItemLongClickListener() {
             @Override 
            public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
                // Aktuelle _id merken.
               mCurrentRecID = id;
           return false;
             }
        });

An dieser stelle rufst du deine andere Activity zum berabeiten auf.

Code:
 public boolean onContextItemSelected(MenuItem item) {

    switch (item.getItemId()) {

        case R.id.men_edit:

            // Datensatz editieren. Daher wird die _id des Datensatzes mitgegeben 
            Intent intent = new Intent(getApplicationContext(), DictionaryEdit.class);
        Bundle bundle = new Bundle();
        bundle.putLong("_id", mCurrentRecID);
        intent.putExtra("bundle", bundle);
        startActivityForResult(intent,REQUEST_DICTIONARYEDIT);
            return true;

        case R.id.men_add:

            // Neuanlage. Daher wird die _id mit 0 übergeben.
            Intent intent2 = new Intent(getApplicationContext(), DictionaryEdit.class);
        Bundle bundle2 = new Bundle();
        bundle2.putLong("_id", 0);
        intent2.putExtra("bundle", bundle2);
        startActivityForResult(intent2,REQUEST_DICTIONARYADD);
            return true;

        case R.id.men_delete:

            // Aktueller Datensatz löschen. 
            if(mDB.getDatabase().delete("DICTIONARY", "_ID = "+mCurrentRecID, null) > 0) {
                Toast.makeText(getApplicationContext(), "löschen erfolgreich", Toast.LENGTH_LONG).show();
            }else{
                Toast.makeText(getApplicationContext(), "Fehler beim löschen", Toast.LENGTH_LONG).show();
            }
            // Den Cursor aktualisieren.
            mAdapter.getCursor().requery();
            return true;

        case R.id.men_seek:

        // Einen filter erstellen. Die neue Abfrage wird in der Result-Methode erzeugt. 
            Intent intent3 = new Intent(getApplicationContext(), SeekEdit.class);
        startActivityForResult(intent3,REQUEST_DICTIONARYSEEK);
            return true;
    }
        return super.onContextItemSelected(item);
    }

Wenn die aufgerufene Aktivität geschlossen wird kannst du die Rückgabe hier verarbeiten.

Code:
public void onActivityResult(int requestCode, int resultCode, Intent data) {

        switch (requestCode) {

        case REQUEST_DICTIONARYEDIT:

            if (resultCode == Activity.RESULT_OK) {
                mAdapter.getCursor().requery();
            }
            break;

        case REQUEST_DICTIONARYADD:

            if (resultCode == Activity.RESULT_OK) {
            	// Cursor aktualisieren. Die Neuanlage soll ja sofort
            	// in der ListView sichtbar werden. 
            	mAdapter.getCursor().requery();
            }
            break;

        case REQUEST_DICTIONARYSEEK:

        	if (resultCode == Activity.RESULT_OK) {
            	   // Im Bündel steckt der Such bzw. Filterbegriff von SeekEdit.
        	   Bundle bundle = data.getExtras().getBundle("bundle");
            	   if(bundle != null){
            		// Neu Abfrage erstellen und der ListView zuweisen.
            		String sql = "SELECT _id,  Source || ' / ' || Target || ' _id = ' || _id AS "+
                        "Auswahl FROM DICTIONARY WHERE Auswahl like '%"+bundle.getString("Result")+"%'";
            		initListView(sql);
            	   }
               }
               break;
        }
    }

Gruß enrem
 
Danke für deine ausführliche Antwort, aber mein Problem liegt im Moment nicht daran ein angeklicktes Item aus der Listview zu editieren sondern, ich will das angeklickte Item einfach auf die nächste Activity übertragen. Wenn ich im Moment auf ein item in der Listview klicke bekomme ich auch ein Wert zurück doch nicht immer den richtigen. Beispiel:

Beispiel1 Beispiel2 Beispiel3 Beispiel4 stehen in eine listview.
Klicke ist jetzt auf Beispiel1 bekomme ich auch Beispiel1 angezeigt klicke ich auf Beispiel2 krieg ich auch Beispiel2 angezeigt, klicke ich jedoch auf Beispiel3 zeigt er mir Beispiel4 an und halt wenn ich auf Beispiel4 klicke zeigt er mir Beispiel3 an. Genau soetwas passiert bei mir auf einer Activity halt nur andere Werte anstatt von den Beispielen.

MFG Chris92
 
Ach ich sehe gerade du arbeitest in der onItemClick mit der Position.

Versuch doch mal statt mit der Position mit der id zu arbeiten. Die id gibt die einen eindeutigen Schlüssel für den Datensatz zurück. Die Position gibt dir die Position des Items. Wenn du einen Filter verwendest kannst du 10 Items in der ListView haben (Pos 1 bis 10). In der Datenbank können 1000 Datensätze (id 1 bis 1000) stehen.

Hoffe es hilft. Mein Tipp immer mit der _id Arbeiten. Du solltest auch bei der Tabellenbezeichnung oder bei den Feldnamen auf Umlaute wie "ä,ö,ü,ß usw." verzichten. Das kann Probleme geben. War früher zumindest so.

Gruß enrem
 
  • Danke
Reaktionen: Chris92

Ähnliche Themen

S
Antworten
33
Aufrufe
2.671
Sempervivum
S
A
Antworten
10
Aufrufe
1.021
swa00
swa00
S
Antworten
3
Aufrufe
637
swa00
swa00
Zurück
Oben Unten