Symbol vor Eintrag in ListView setzen

ensacom

ensacom

Ambitioniertes Mitglied
6
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
 
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.
 
klingt einfach, werde es gleich mal testen und melde mich dann wieder.

Danke erst mal.
 
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();
        }
    }
 
Schau mal in Dein LogCat!
 
Und überlegen, was "in setViewValue für die Spalten den Text oder das Bild setzen." bedeuten könnte :)
18 Minuten ausprobieren ist zu wenig....
 
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)
 
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...
 

Ähnliche Themen

A
Antworten
1
Aufrufe
637
swa00
swa00
A
Antworten
10
Aufrufe
1.021
swa00
swa00
D
Antworten
23
Aufrufe
2.537
Data2006
D
Zurück
Oben Unten