Wer kann mir diesen Quelltext erklären?

ensacom

ensacom

Ambitioniertes Mitglied
Threadstarter
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.
 
ensacom

ensacom

Ambitioniertes Mitglied
Threadstarter
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());
  }
 
friedger

friedger

Fortgeschrittenes Mitglied
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.
 
ensacom

ensacom

Ambitioniertes Mitglied
Threadstarter
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?
 
ensacom

ensacom

Ambitioniertes Mitglied
Threadstarter
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());
  }
 
friedger

friedger

Fortgeschrittenes Mitglied
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.
 
friedger

friedger

Fortgeschrittenes Mitglied
Was geht denn nicht beim Klicken?
Probier mal onListItemClick und sieh Dir unbedingt nochmal die NotePad Tutorials an.
 
ensacom

ensacom

Ambitioniertes Mitglied
Threadstarter
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:
ensacom

ensacom

Ambitioniertes Mitglied
Threadstarter
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?
 
friedger

friedger

Fortgeschrittenes Mitglied
Die Id kommt mit der MenuItem.getMenuInfo() mit:

((AdapterContextMenuInfo) item.getMenuInfo()).id
 
ensacom

ensacom

Ambitioniertes Mitglied
Threadstarter
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.
 
ensacom

ensacom

Ambitioniertes Mitglied
Threadstarter
Sorry dass ich dich so genervt habe.
Wird sicher noch öfter vorkommen ;-)
 
Oben Unten