Wer kann mir diesen Quelltext erklären?

ensacom

ensacom

Ambitioniertes Mitglied
6
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.
 
welcher code?
 
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());
  }
 
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.
 
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?
 
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());
  }
 
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.
 
Was geht denn nicht beim Klicken?
Probier mal onListItemClick und sieh Dir unbedingt nochmal die NotePad Tutorials an.
 
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:
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?
 
Die Id kommt mit der MenuItem.getMenuInfo() mit:

((AdapterContextMenuInfo) item.getMenuInfo()).id
 
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.
 
Da bin ich auch froh :)
 
Sorry dass ich dich so genervt habe.
Wird sicher noch öfter vorkommen ;-)
 

Ähnliche Themen

B
Antworten
3
Aufrufe
911
jogimuc
J
SpeedySix
Antworten
13
Aufrufe
1.402
jogimuc
J
R
  • RalfKahl
Antworten
10
Aufrufe
302
RalfKahl
R
Zurück
Oben Unten