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

Symbol vor Eintrag in ListView setzen

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

  1. ensacom, 27.05.2009 #1
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Hallo, ich lese mehrere Werte aus einer SQLite Datenbank aus und füge die in eine ListView ein.

    Kann mir einer sagen wie ich je nach Status (Fahrzeugart privat, dienstlich) ein anderes Symbol vor jeden Eintrag in der ListView bekomme?

    Hier mein source

    fahrzeuge.java
    Code:
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
            setDefaultKeyMode(DEFAULT_KEYS_SHORTCUT);
    
            getListView().setOnCreateContextMenuListener(this);
            
               myDB = this.openOrCreateDatabase(TankPro2.MY_DATABASE_NAME, MODE_PRIVATE, null);
               
               Cursor c = myDB.rawQuery("SELECT _id, name || ', ' || model as bezeichnung, 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.KfzNameModel });
              
            adapter.setViewBinder(new ViewBinder() 
            {               
                @Override
                public boolean setViewValue(View view, Cursor theCursor, int column) 
                {
                    final String ColNameModel = theCursor.getString(1); //Name und Model
                    ((TextView)view).setText(ColNameModel);
                    return true;
                }
            });
            this.setListAdapter(adapter);
      }
    
    fahrzeuge.xml
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    
        <TextView 
              android:id="@+id/KfzNameModel"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content"
               android:padding="10px" 
               android:textStyle="bold" android:textSize="24px">
        </TextView>
    
    </LinearLayout>
    
    Vielen Dank
    
     
  2. friedger, 28.05.2009 #2
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    In das layout fahrzeug.xml ein View für das Bildchen hinzufügen, im Cursoradapter eine weitere Spalte hinzufügen (new String[]{"_id", "_status"}, new int[]{R.id.text, R.id.icon}) und in setViewValue für die Spalten den Text oder das Bild setzen.
     
  3. ensacom, 28.05.2009 #3
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    klingt einfach, werde es gleich mal testen und melde mich dann wieder.

    Danke erst mal.
     
  4. ensacom, 28.05.2009 #4
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Nee so einfach ist es dann wohl doch nicht.
    Habe das View in der layou-Datei eingefügt. ID = symbol
    Habe in der activity die zweite Spalte angegeben. (tankinhalt und R.id.symbol)

    Absturz wenn ich R.id.symbol angebe. gebe ich R.id.KfzNameModel nochmal an. kein Absturz.

    Nun meine Fragen.
    Warum der Absturz.
    Wo soll ich nun sagen dass er auch das Bild anzeigen soll?




    Hier erst mal mein layout

    fahrzeuge.xml

    Code:
    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    
        <TextView 
              android:id="@+id/KfzNameModel"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content"
               android:padding="10px" 
               android:textStyle="bold" android:textSize="24px">
        </TextView>
        
        
        <View 
            android:id="@+id/symbol" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content">
        </View>
        
    </LinearLayout>
    

    Hier meine java-Datei
    fahrzeuge.java
    Code:
    @Override
        protected void onStart() {
            super.onStart();
    
            SQLiteDatabase myDB = null;
            try{
                myDB = this.openOrCreateDatabase(TankPro2.MY_DATABASE_NAME, MODE_PRIVATE, null);
                Cursor c = myDB.rawQuery("SELECT _id, name || ', ' || model as bezeichnung, tankinhalt FROM " + TankPro2.MY_DATABASE_TABLE, null);        
                   startManagingCursor(c);    
    
                   getListView().setOnCreateContextMenuListener(this);
                   
                   final SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                        R.layout.fahrzeuge, 
                        c,
                        new String[] { "_id", "tankinhalt" },
                        new int[] { R.id.KfzNameModel, R.id.symbol }
                   );
                  
                adapter.setViewBinder(new ViewBinder() 
                {               
                    @Override
                    public boolean setViewValue(View view, Cursor theCursor, int column) 
                    {
                        final String ColNameModel = theCursor.getString(1); //Name und Model
                        ((TextView)view).setText(ColNameModel);
                        
                        return true;
                    }
                });
                this.setListAdapter(adapter);
            }finally {
                if (myDB != null)
                    myDB.close();
            }
        }
    
     
  5. friedger, 29.05.2009 #5
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    Schau mal in Dein LogCat!
     
  6. friedger, 29.05.2009 #6
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    Und überlegen, was "in setViewValue für die Spalten den Text oder das Bild setzen." bedeuten könnte :)
    18 Minuten ausprobieren ist zu wenig....
     
  7. ensacom, 29.05.2009 #7
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Ich habe es jetzt seit mehreren Stunden probiert und weiß dass der Fehler genau in der function setViewValue liegt.

    ich habe es in unendlichen Kombinationen versucht. Alles ohne Erfolg.
    unten habe ich mal meinen Quelltext und die Ausgabe des logcat angehängt.
    Aus der Logdatei wird man als Anfänger auch nicht schlau.

    Hier mein Quelltext wie ich es jetzt habe und wie es auch nicht funktioniert

    fahrzeuge.java
    Code:
    @Override
        protected void onStart() {
            super.onStart();
    
            SQLiteDatabase myDB = null;
            try{
                myDB = this.openOrCreateDatabase(TankPro2.MY_DATABASE_NAME, MODE_PRIVATE, null);
                Cursor c = myDB.rawQuery("SELECT _id, name || ', ' || model as bezeichnung, tankinhalt FROM " + TankPro2.MY_DATABASE_TABLE, null);        
                   startManagingCursor(c);    
    
                   getListView().setOnCreateContextMenuListener(this);
                   
                   final SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                        R.layout.fahrzeuge, 
                        c,
                        new String[] { "tankinhalt", "_id" },
                        new int[] { R.id.ico, R.id.KfzNameModel }
                   );
                  
                adapter.setViewBinder(new ViewBinder() 
                {               
                    @Override
                    public boolean setViewValue(View view, Cursor theCursor, int column) 
                    {
                        final String ColIcon = theCursor.getString(1);//Icon
                        final String ColNameModel = theCursor.getString(2); //Name und Model
                       
                        ((ImageView)view).setImageResource(R.drawable.calendar);
                        ((TextView)view).setText(ColNameModel);
                        
                        return true;
                    }
                });
                this.setListAdapter(adapter);
            }finally {
                if (myDB != null)
                    myDB.close();
            }
        }
    
    fahrzeuge.xml
    Code:
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="?android:attr/listPreferredItemHeight"
        
        android:padding="6dip">
        
        <ImageView
            android:id="@+id/ico"        
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_marginRight="6dip"        
            android:src="@drawable/icon" />
    
        <LinearLayout
            android:orientation="vertical"
        
            android:layout_width="0dip"
            android:layout_weight="1"
            android:layout_height="fill_parent">
    
            <TextView
                android:id="@+id/KfzNameModel"
                android:layout_width="fill_parent"
                android:layout_height="0dip"
                android:layout_weight="1"                    
                android:gravity="center_vertical"
                android:text="My Application" />
                
            <TextView  
                android:layout_width="fill_parent"
                android:layout_height="0dip"
                android:layout_weight="1" 
                
                android:singleLine="true"
                android:ellipsize="marquee"
                android:text="Simple application that shows how to use RelativeLayout" />
                
        </LinearLayout>
    
    </LinearLayout>
    
    LogCat
    Code:
    05-29 13:02:22.119: ERROR/AndroidRuntime(300): Uncaught handler: thread main exiting due to uncaught exception
    05-29 13:02:22.129: ERROR/AndroidRuntime(300): java.lang.ClassCastException: android.widget.ImageView
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at com.ensacom.android.TankPro2.fahrzeuge$1.setViewValue(fahrzeuge.java:71)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:155)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.widget.CursorAdapter.getView(CursorAdapter.java:186)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.widget.AbsListView.obtainView(AbsListView.java:1269)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.widget.ListView.makeAndAddView(ListView.java:1623)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.widget.ListView.fillDown(ListView.java:607)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.widget.ListView.fillFromTop(ListView.java:664)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.widget.ListView.layoutChildren(ListView.java:1481)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.widget.AbsListView.onLayout(AbsListView.java:1113)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.view.View.layout(View.java:6133)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.view.View.layout(View.java:6133)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.widget.LinearLayout.onLayout(LinearLayout.java:918)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.view.View.layout(View.java:6133)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.view.View.layout(View.java:6133)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.view.ViewRoot.performTraversals(ViewRoot.java:929)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1482)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.os.Handler.dispatchMessage(Handler.java:99)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.os.Looper.loop(Looper.java:123)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at android.app.ActivityThread.main(ActivityThread.java:3948)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at java.lang.reflect.Method.invokeNative(Native Method)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at java.lang.reflect.Method.invoke(Method.java:521)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
    05-29 13:02:22.129: ERROR/AndroidRuntime(300):     at dalvik.system.NativeStart.main(Native Method)
    
     
  8. friedger, 29.05.2009 #8
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    Je Spalte wird die Funktion setViewValue aufgerufen, anhand der Spalte kann man sehen, ob man den TextView oder den ImageView setzen muss.
    Am besten mal einen Breakpoint in die Funktion setzen und dann sich das an ganze ansehen.

    Die view kann nicht von einer Zeile in die andere vom ImageView zum TextView werden.

    Also if (column == 1) {...} und so weiter...
     

Diese Seite empfehlen