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

Wer kann mir diesen Quelltext erklären?

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von ensacom, 26.05.2009.

  1. ensacom, 26.05.2009 #1
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Hallo an die, die sich richtig mit Java und Android auskennen.
    Wer kann mir folgenden Quellcode erklären?

    Ich bin bis jetzt nicht dahinter gestiegen was eigentlich passiert.

    Ok, es wird Zur Datenbank verbunden,
    Dann wird ein SimpleCursorAdapter erstellt (Sowas wie eine Liste?)
    Was bedeuten die übergebenen Parameter?

    Kein Schimmer was "adapter.setViewBinder(new ViewBinder() {" macht und was setViewValue mit setViewBinder zu tun hat.

    Wäre toll wenn mir das einer erklären könnte und vielleicht sogar einen Tipp hat wie ich diese Abfrage so umschreiben kann, dass ich die Daten aus der Datenbank auch in eine Liste ausgeben kann, die in meiner layout.xml definiert ist.
     
  2. swordi, 26.05.2009 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    welcher code?
     
  3. ensacom, 26.05.2009 #3
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Oh sorry, wie peinlich ;-)

    Also hier der code

    Code:
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
            SQLiteDatabase myDB = null;
              myDB = this.openOrCreateDatabase(TankPro2.MY_DATABASE_NAME, MODE_PRIVATE, null);
             
              Cursor c = myDB.rawQuery("SELECT _id, name, model, tankinhalt FROM " + TankPro2.MY_DATABASE_TABLE + ";", null);        
               startManagingCursor(c);    
    
               final SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                                                                  android.R.layout.simple_list_item_1, 
                                                                  c,
                                                                  new String[] { "_id" },
                                                                  new int[] { android.R.id.text1 });
               
            adapter.setViewBinder(new ViewBinder() 
            {               
                @Override
                public boolean setViewValue(View view, Cursor theCursor, int column) 
                {
                      final String ColumnName = theCursor.getString(1); //Name
                    final String ColumnModel = theCursor.getString(2); //Model
                  
                    ((TextView)view).setText(ColumnName + ", " + ColumnModel);
                    
                    return true;
                }
               });
                       
               this.setListAdapter(adapter);
            
               registerForContextMenu(getListView());
      }
    
     
  4. friedger, 26.05.2009 #4
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    Ein Adapter ist etwas das zwischen zwei Dingen eine Verbindung herstellt, in diesem Fall zwischen dem Cursor und der ListView.

    Die ListView hält für jeden Listeneintrag eine View bereit, diese wird durch den ViewBinder mit den Werten aus dem Cursor gefüllt.

    Wenn Du Dein eigenes Layout verwendest musst Du
    android.R.layout.simple_list_item_1 durch Dein Layout für den Listeneintrag ersetzen und android.R.id.text1 durch eine id aus dem Layout.
     
  5. ensacom, 26.05.2009 #5
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Hallo, ich habe ja schon das Problem, wenn ich setContentView(R.layout.fahrzeuge); ins onCreate setze, das mein Programm sofort abstürzt.

    Du schreibst, ich soll "android.R.layout.simple_list_item_1" durch mein eigenes Layout ersetzen. Wie meinst Du das? Durch "R.layout.fahrzeuge" ersetzen und die Zeile "setContentView(R.layout.fahrzeuge);" entfernen?

    "android.R.id.text1" ersetze ich dann durch die id aus dem Layout, das verstehe ich.
    Nur, welche Komponente nimmt man dann am besten für eine Liste?
     
  6. ensacom, 26.05.2009 #6
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Ok, ich habe es jetzt dank deiner Hilfe geschafft ein eigenes Layout zu benutzen.
    Jetzt habe ich das Problem, das der einfache Klick auf eines der TextEdits nicht mehr funktioniert, das Contextmenu funktioniert noch.

    Kann mir einer sagen wie ich nun den einfachen Klick auf einen der Einträge in der Liste hinbekomme?

    Hier mein Quelltext
    Code:
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            
            SQLiteDatabase myDB = null;
              myDB = this.openOrCreateDatabase(TankPro2.MY_DATABASE_NAME, MODE_PRIVATE, null);
             
              Cursor c = myDB.rawQuery("SELECT _id, name, model, tankinhalt FROM " + TankPro2.MY_DATABASE_TABLE + ";", null);        
               startManagingCursor(c);    
    
               final SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                                                                     R.layout.fahrzeuge, 
                                                                  c,
                                                                  new String[] { "_id" },
                                                                  new int[] { R.id.empty });
               
            adapter.setViewBinder(new ViewBinder() 
            {               
                @Override
                public boolean setViewValue(View view, Cursor theCursor, int column) 
                {
                      final String ColumnName = theCursor.getString(1); //Name
                    final String ColumnModel = theCursor.getString(2); //Model
                  
                    ((TextView)view).setText(ColumnName + ", " + ColumnModel);
                    
                    return true;
                }
               });
                       
               this.setListAdapter(adapter);
            
               registerForContextMenu(getListView());
      }
    
     
  7. friedger, 26.05.2009 #7
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    Wegen der Abstürze unbedingt LogCat befragen, das erklärt einiges.

    Für ListActivity braucht man ein R.layout.fahrzeuge und ein R.layout.fahrzeugItem. In fahrzeugItem muss man dann die ids vergeben, die dem SimpleCursorAdapter mitgegeben werden.

    setContentView(R.layout.fahrzeuge) ist notwendig und SimpleCursorAdapter muss fahrzeugItem mitgegeben werden. fahrzeugItem kann ein einfaches LinearLayout sein. layout.fahrzeuge muss ein ListView enthalten.
     
  8. friedger, 26.05.2009 #8
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    Was geht denn nicht beim Klicken?
    Probier mal onListItemClick und sieh Dir unbedingt nochmal die NotePad Tutorials an.
     
  9. ensacom, 26.05.2009 #9
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Das ist mir jetzt echt zu hoch.
    Gebe ich die id eines TextView an geht es, gebe ich aber die id einer ListView an dann stürzt er ab und sagt mir im LogCat folgendes

    Code:
    05-26 23:25:09.249: ERROR/AndroidRuntime(1361): Uncaught handler: thread main exiting due to uncaught exception
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361): java.lang.ClassCastException: android.widget.ListView
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at com.ensacom.android.TankPro2.fahrzeuge$1.setViewValue(fahrzeuge.java:57)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:155)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.widget.CursorAdapter.getView(CursorAdapter.java:186)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.widget.AbsListView.obtainView(AbsListView.java:1269)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.widget.ListView.makeAndAddView(ListView.java:1623)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.widget.ListView.fillDown(ListView.java:607)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.widget.ListView.fillFromTop(ListView.java:664)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.widget.ListView.layoutChildren(ListView.java:1481)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.widget.AbsListView.onLayout(AbsListView.java:1113)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.view.View.layout(View.java:6133)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.view.View.layout(View.java:6133)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.widget.LinearLayout.onLayout(LinearLayout.java:918)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.view.View.layout(View.java:6133)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.view.View.layout(View.java:6133)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.view.ViewRoot.performTraversals(ViewRoot.java:929)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1482)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.os.Handler.dispatchMessage(Handler.java:99)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.os.Looper.loop(Looper.java:123)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at android.app.ActivityThread.main(ActivityThread.java:3948)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at java.lang.reflect.Method.invokeNative(Native Method)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at java.lang.reflect.Method.invoke(Method.java:521)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
    05-26 23:25:09.269: ERROR/AndroidRuntime(1361):     at dalvik.system.NativeStart.main(Native Method)
    
    Außerdem ist folgendes merkwürdig.
    Lasse ich diese Zeile weg "setContentView(R.layout.fahrzeuge);" und gebe die id der TextView aus meiner xml-Datei an, dann funktioniert es (onListItemClick geht nicht, warscheinlich weil ich eine TextView verwende???)

    Füge ich die Zeile "setContentView(R.layout.fahrzeuge);" ein stürzt das Programm sofort ab.
     
    Zuletzt bearbeitet: 26.05.2009
  10. ensacom, 26.05.2009 #10
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Warum das klicken nicht ging habe ich herausgefunden.

    Ich habe die beiden Zeilen aus der fahrzeuge.xml entfernt und schon ging es.
    Code:
    android:clickable="true" 
    android:longClickable="true" 
    
    Mein Code sieht jetzt so aus.
    Code:
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
          //  setContentView(R.layout.fahrzeuge);
            
            SQLiteDatabase myDB = null;
              myDB = this.openOrCreateDatabase(TankPro2.MY_DATABASE_NAME, MODE_PRIVATE, null);
             
              Cursor c = myDB.rawQuery("SELECT _id, name, model, tankinhalt FROM " + TankPro2.MY_DATABASE_TABLE + ";", null);        
               startManagingCursor(c);    
    
               final SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                                                                     R.layout.fahrzeuge, 
                                                                  c,
                                                                  new String[] { "_id" },
                                                                  new int[] { R.id.empty });
               
            adapter.setViewBinder(new ViewBinder() 
            {               
                @Override
                public boolean setViewValue(View view, Cursor theCursor, int column) 
                {
                      final String ColumnName = theCursor.getString(1); //Name
                    final String ColumnModel = theCursor.getString(2); //Model
                  
                    ((TextView)view).setText(ColumnName + ", " + ColumnModel);
                    
                    return true;
                }
               });
                       
               this.setListAdapter(adapter);
            
               registerForContextMenu(getListView());
      }
    
    fahrzeuge.xml
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    
      <TextView 
              android:id="@+id/empty"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:padding="10px" 
            android:textSize="22px">
        </TextView>        
    
    </LinearLayout>
    
    Das müsste doch so jetzt alles stimmen oder?
    Wie bekomme ich aber nun die ID des angeklickten EIntrages an mein ContextMenü übergeben?
     
  11. friedger, 27.05.2009 #11
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    Die Id kommt mit der MenuItem.getMenuInfo() mit:

    ((AdapterContextMenuInfo) item.getMenuInfo()).id
     
  12. ensacom, 27.05.2009 #12
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Danke, ich habe es dank deiner Hilfe und ewigen herumprobiere mit dem Notes Beispiel von Android endlich geschafft.

    onClick geht, Contextmenü geht und ich kann mein eigenes Layout benutzen

    Nochmal vielen Dank.
     
  13. friedger, 27.05.2009 #13
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    Da bin ich auch froh :)
     
  14. ensacom, 27.05.2009 #14
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Sorry dass ich dich so genervt habe.
    Wird sicher noch öfter vorkommen ;-)
     

Diese Seite empfehlen