1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Listview per klick o Spinner aktualisieren

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Chris92, 12.11.2010.

  1. Chris92, 12.11.2010 #1
    Chris92

    Chris92 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    123
    Erhaltene Danke:
    0
    Registriert seit:
    01.10.2010
    Hallo ich wollte fragen wie man eine ListView per Klick auf einen Spinner aktualisieren kann. Bis jetzt finde ich heraus welche Item im Spinner angeklickt wurde doch ich finde nix was mir weiter Hilft um die Listview zu aktualisieren.

    MFG Chris92
     
  2. egon232, 13.11.2010 #2
    egon232

    egon232 Android-Hilfe.de Mitglied

    Beiträge:
    91
    Erhaltene Danke:
    1
    Registriert seit:
    05.02.2010
    Ich hoffe, dass ich dich richtig verstanden habe. Du willst im ListView änderungen vornehmen wenn der wert im spinner geändert wurde?

    Füge dem Spinner einen ChangeListener hinzu und aktualisiere dann die ListView wenn der StateChanged event ausgeführt wurde

    Grüße
     
  3. Chris92, 13.11.2010 #3
    Chris92

    Chris92 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    123
    Erhaltene Danke:
    0
    Registriert seit:
    01.10.2010
    Hallo Danke für deine Antwort doch ich finde kein ChangeListener event bei meinem Spinner. :sad: Wenns geht könntest du mir kurz ein Stück Code zeigen wo das angewendet wird und wie man eine Listview dann neu lädt.

    Also versuche nochmals mein Problem besser zu erklären. Am Anfang wird die ListView mit allen Trainingsübung aufgefüllt dann kann man über einen Spinner z.B: Bizeps ausfällen dann sollen in der ListView nur die Übungen für den Bizeps stehen. Ich hab bereits die string arrays für die Übungen erstellt doch mir fehlen die Befehle und die richtige Kenntnis wie man die einsetzt um die ListView zu aktualisieren.

    MFG Chris92
     
  4. enrem, 13.11.2010 #4
    enrem

    enrem Erfahrener Benutzer

    Beiträge:
    188
    Erhaltene Danke:
    13
    Registriert seit:
    17.01.2010
    Wenn du mit einer SQL-Datenbank und einem simplen Adapter arbeitest, kann ein einfaches "mAdapter.getCursor().requery()" nach der Neuanlage oder dem editieren reichen.

    mAdapter ist eine Variable indem der Adapter steckt...

    In diesem Beipspiel klappt das.

    Schnipsel:RM Dictionary ? Android-Schnipsel-Wiki

    Gruß enrem

    Ich habe gerade deinen neuen Beitrag gelesen. Ich schlage dir vor du machst dir eine SQL-Datenbank. Das Beispiel hast du ja. Dann füllst deinen Spinner mit Filterbedingungen. Bizeps, Trizeps, Latissimus usw. In der Tabelle SQL-Tabelle packst du deine Trainingsübungen. Beispiel Bizeps mit Datum usw. Nun kannst du bequem über eine SQL-Abfrage mit like einen Filter auf die SQL-Tabelle mit deinen Trainigsübungen setzen. Entweder über einen Zeitraum oder über einen Muskel.

    Im Beispiel Dictionary ist fast alles was du benötigst, bis auf den Filter mit dem Spinner. Dafür gibt es dort ein suchen. Ist im Grunde ein Filtern in der Tabelle.

    Ich hoffe ich habe dich richtig verstanden.
     
    Zuletzt bearbeitet: 13.11.2010
  5. Chris92, 13.11.2010 #5
    Chris92

    Chris92 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    123
    Erhaltene Danke:
    0
    Registriert seit:
    01.10.2010
    Nee ich arbeite nicht mit einer SQL Datenbank die werte stehen einfach in der Datei arrays.xml im Verzeichnis res/values
     
  6. enrem, 13.11.2010 #6
    enrem

    enrem Erfahrener Benutzer

    Beiträge:
    188
    Erhaltene Danke:
    13
    Registriert seit:
    17.01.2010
    Es kommen doch sicherlich immer wieder neue Trainigsübungen hinzu oder? Packst du die dann auch in dein Array oder sind die Trainigsübungen auf eine bestimmte Anzahl beschränkt.

    Ich frage danach, weil wenn du Daten sammelst, ist es besser und einfacher die in einer SQL-Datenbank bzw. Tabelle zu packen. Du hast später je nach dem was du machen möchtest mehr möglichkeiten.
     
  7. Chris92, 13.11.2010 #7
    Chris92

    Chris92 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    123
    Erhaltene Danke:
    0
    Registriert seit:
    01.10.2010
    Ich willst so lassen denn sonst braucht man immer eine Verbindung mit dem Internet und das finde ich nicht so gudd.
     
  8. enrem, 13.11.2010 #8
    enrem

    enrem Erfahrener Benutzer

    Beiträge:
    188
    Erhaltene Danke:
    13
    Registriert seit:
    17.01.2010
    Nein Chris92 du musst ja nicht die Datenbank auf einen Webserver packen.

    Datenbank hört sich kompliziert an, ist es aber nicht. Im Grunde ist es nur eine Datei die du auf deinem Handy in der Applikation oder auf der SD-Karte ablegen kannst. Android besitzt SQLite und regelt das meiste für dich.

    Hier siehts du wie einfach man eine Datenbank anlegt (Datei auf der SD-Karte) und wie du damit umgehen kannst.

    Schnipsel:RM SQL SDCard ? Android-Schnipsel-Wiki
     
  9. Chris92, 13.11.2010 #9
    Chris92

    Chris92 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    123
    Erhaltene Danke:
    0
    Registriert seit:
    01.10.2010
    Achso ok dann versuch ich das mal. Danke für die Hilfe
     
  10. egon232, 13.11.2010 #10
    egon232

    egon232 Android-Hilfe.de Mitglied

    Beiträge:
    91
    Erhaltene Danke:
    1
    Registriert seit:
    05.02.2010
    Sorry war grad zu java fixiert^^ Muss nachm formatieren erst wieder Eclipse etc installieren, dann kann ich ma schauen...

    Erkennt man in deinem String array was bizeps Übungen sind?
     
  11. Chris92, 13.11.2010 #11
    Chris92

    Chris92 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    123
    Erhaltene Danke:
    0
    Registriert seit:
    01.10.2010
    Ja ich hab verschiedene arrays erstelle eine für Alle Übungen und eine für Bizeps z.B das sind verschiedene Arrays ich muss es nur irgendwie hin bekommen diese arrays dann im richtigen Moment hinein zuladen in die ListView.

    MFG Chris92
     
  12. egon232, 13.11.2010 #12
    egon232

    egon232 Android-Hilfe.de Mitglied

    Beiträge:
    91
    Erhaltene Danke:
    1
    Registriert seit:
    05.02.2010
    hab grad mal in die dev docs geschaut.

    Definition des Listeners:
    Code:
    public class MyOnItemSelectedListener implements OnItemSelectedListener {
    
        public void onItemSelected(AdapterView<?> parent,
            View view, int pos, long id) {
          Toast.makeText(parent.getContext()), "The planet is " +
              parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
        }
    
        public void onNothingSelected(AdapterView parent) {
          // Do nothing.
        }
    }
    Zuweisung:
    Code:
    spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
    kannste hier unter punkt 5 und 6 nachlesen:

    Spinner | Android Developers

    grüße
     
  13. Chris92, 19.11.2010 #13
    Chris92

    Chris92 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    123
    Erhaltene Danke:
    0
    Registriert seit:
    01.10.2010
    So ich bins wieder sry dass ich lange nichts mehr geschrieben habe, doch ich hatte viel zutun mit der Schule. Doch jetzt arbeite ich weiter daran und ich habs geschafft die Datenbank zu erstellen doch jetzt steh ich bei einem weiteren Problem: Ich weis nicht wie ich das schnell und ohne weiteren Aufwand hin bekomme 100 Übungen in die Datenbank einzufügen. Mit dem Programm wo auf der Seite war kann man ja Records hinzufügen doch nur einzeln und das 100mal zu erledigen finde ich blödsin, das muss doch irgendwie anders möglich sein. Aber wie??


    MFG Chris92
     
  14. Chris92, 19.11.2010 #14
    Chris92

    Chris92 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    123
    Erhaltene Danke:
    0
    Registriert seit:
    01.10.2010
    Ist gut ich habs herausgefunden. Ich habs mit CSV gelöst.

    MFG Chris92
     
  15. enrem, 19.11.2010 #15
    enrem

    enrem Erfahrener Benutzer

    Beiträge:
    188
    Erhaltene Danke:
    13
    Registriert seit:
    17.01.2010
    Wenn du Datensätze in deiner App hinzufügen möchtest geht das so:

    Code:
    success = execute("INSERT OR IGNORE INTO Tabelle1("+
              "'Feld1','Feld2','Feld3','Feld4') "+
              "VALUES ('Wert 1','Wert 2','Wert 3','Wert 4')");
    
    oder

    Code:
    // Rückgabe -1 == Fehler, sonst die aktuelle ROWID
    long inserResult;
            
    ContentValues values = new ContentValues();
    
    values.put("Feld1", "Dein Wert für Feld 1");
    values.put("Feld2", "Dein Wert für Feld 2");
    
    inserResult = mDatabase.insert("Tabelle1", null, values);
    
    mDatabase ist deine Datenbank.
    Tabelle1 ist deine Tabelle für die Übungen
    Feld1 usw. sind die Feldattribute bzw. Feldnamen.

    Macht Sinn wenn du unter Android weitere Übungen hinzufügen möchtest.

    Noch ein Tipp!!!

    Mach dir in jeder Tabelle ein Feld _id mit einem Autoincrement. Sonst funktioniert der SimpleListViewAdapter nicht mit der ListView. Gibt zwar andere Wege die Probleme zu lösen, damit ersparst du dir jedoch später Arbeit.

    Code:
    "_id INTEGER PRIMARY KEY AUTOINCREMENT"
    Gruß enrem
     
  16. Chris92, 19.11.2010 #16
    Chris92

    Chris92 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    123
    Erhaltene Danke:
    0
    Registriert seit:
    01.10.2010
    Also ich bekomme es hin die Daten die in der Datenbank stehen in einer Textview anzuzeigen und jetzt will ich diese Daten in eine Listview schreiben doch ich weis nicht wie :( weis du vieleicht wie das geht?

    MFG Chris92
     
  17. enrem, 19.11.2010 #17
    enrem

    enrem Erfahrener Benutzer

    Beiträge:
    188
    Erhaltene Danke:
    13
    Registriert seit:
    17.01.2010
    Kannst du hiermit was anfangen?

    in der onCreate mach folgendes:

    Code:
            
            // mDB ist deine Datenbank die solltest du bereits offen haben...
            
        // Den Inhalt der ListView erzeugen. Angezeigt wird das Attribut Auswahl.
            initListView("SELECT _id,  Feld1 AS Auswahl FROM Tabelle1");
    
    
    die Methode initListView()

    Code:
     private void initListView(String sql){
            
            // Du wirst getDatabase() nicht benötigen. Du kannst rawQuery direkt auf dein Datenbankobjekt anwenden.
            // also so Cursor cur = mDB.rawQuery(sql, null);
    
            // Abfrage erstellen. In cur ist das Ergebnis der Abfrage.
            Cursor cur = mDB.getDatabase().rawQuery(sql, null);
            
            if (cur != null) {
                  // Einen Adapter ertellen und der ListView zuweisen..
               startManagingCursor(cur);
               mAdapter = new SimpleCursorAdapter(this, R.layout.dictionary_list, cur,
                           new String[] { "Auswahl" }, new int[] { android.R.id.text1 });
               setListAdapter(mAdapter);
            }
        }
    
    Ich hoffe du kannst was damit anfangen. Du benötigst ein Layout mit ner ListView. Im Beispiel nennt sich das Layout dictionary_list. Die Methode initListView kannst du später an anderer Stelle aufrufen, wenn du mal dein Inhalt der Listview filtern möchtest. Ich nenne das Feld immer Auswahl, denn du kannst in der SQL-Abfrage mehrere Felder mit 2 pipes (||) zusammenfassen. Also "Feld1 || Feld2 AS Asuwahl". Das hat den Vorteil das du ohne grossen Aufwand mehrere Felder in der ListView anzeigen lassen kannst. Das aber später...

    Hier das Layout "res/layout/dictionary_list.xml" :

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <LinearLayout android:id="@+id/LinearLayout" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        xmlns:android="http://schemas.android.com/apk/res/android">
                SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.mainlist_item, c,
                        new String[] { "Zeitpunkt", "Menge" }, new int[] { android.R.id.text1, android.R.id.text1 });
    <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="?android:attr/listPreferredItemHeight" android:textAppearance="?android:attr/textAppearanceLarge" android:gravity="center_vertical" android:paddingLeft="5dip" android:layout_width="fill_parent" android:singleLine="false" android:id="@android:id/text1"/>
    
    </LinearLayout>
    
    Habe später etwas mehr Zeit dir das genauer zu erklären...
     
    Zuletzt bearbeitet: 19.11.2010
  18. Chris92, 20.11.2010 #18
    Chris92

    Chris92 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    123
    Erhaltene Danke:
    0
    Registriert seit:
    01.10.2010
    Irgendwie klappt das nicht :(. Hier ist der Code:

    Datei:EigenesTraining.java
    Code:
    package lu.projekt.FitnessApp;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    
    import android.app.Activity;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.SimpleCursorAdapter;
    import android.widget.Spinner;
    import android.widget.TextView;
    import android.widget.Toast;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    
    public class EigenesTraining extends Activity {
          private SimpleCursorAdapter adapterM;
          private SQLiteDatabase db = null;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.eigenestraining);
        
        //Datenbank deklarieren
        
        String path = "/sdcard/renem_sql_sdcard2.db";
        db = SQLiteDatabase.openOrCreateDatabase(path, null);    
        
        initListView("SELECT _ID,  Uebungen AS Auswahl FROM AlleUebungen");
    
      }
    
        private void initListView(String sql) {
            // TODO Auto-generated method stub
             Cursor cur = db.rawQuery(sql, null);
                
                if (cur != null) {
                      // Einen Adapter ertellen und der ListView zuweisen..
                   startManagingCursor(cur);
                   adapterM = new SimpleCursorAdapter(this, R.layout.listitem, cur,
                               new String[] { "Auswahl" }, new int[] { android.R.id.text1 });
                   setListAdapter(adapterM);
                }
    
            
        }
    
        private void setListAdapter(SimpleCursorAdapter adapterM2) {
            // TODO Auto-generated method stub
            
        }
    }
    
    Datei: listitem.xml

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <LinearLayout android:id="@+id/LinearLayout" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        xmlns:android="http://schemas.android.com/apk/res/android">
                SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.mainlist_item, c,
                        new String[] { "Zeitpunkt", "Menge" }, new int[] { android.R.id.text1, android.R.id.text1 });
    <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="?android:attr/listPreferredItemHeight" android:textAppearance="?android:attr/textAppearanceLarge" android:gravity="center_vertical" android:paddingLeft="5dip" android:layout_width="fill_parent" android:singleLine="false" android:id="@android:id/text1"/>
    
    </LinearLayout>
    
    Wenn ich das Programm starten stürtzt es ab wenn ich auf die Activity EigenesTraining wechsele :(.


    Hier ein Bild wie meine Datenbank aussieht:

    [​IMG][​IMG][​IMG]


    MFG Chris92
     

    Anhänge:

  19. enrem, 20.11.2010 #19
    enrem

    enrem Erfahrener Benutzer

    Beiträge:
    188
    Erhaltene Danke:
    13
    Registriert seit:
    17.01.2010
    Hast du die Activity in der Manifestdatei eingetragen? Das vergesse ich auch häufig und führt zum Absturz. Wenn du nicht klar kommst, schick mir die Datenbank, ich mach dir anschl. ein Beispiel :)
     
  20. enrem, 20.11.2010 #20
    enrem

    enrem Erfahrener Benutzer

    Beiträge:
    188
    Erhaltene Danke:
    13
    Registriert seit:
    17.01.2010
    Ich sehe gerade hast du ein Feld "_id" nicht "ID" der Unterstrich ist wichtig!
     

Diese Seite empfehlen