ListView inkl. Bilder füllen...

  • Antworten:2
Gelöschter Account
  • Forum-Beiträge: 37

20.06.2010, 17:01:46 via Website

Hallo,


kann mir jemand mal ein Beispiel posten wie ich eine ListView mit Inhalt fülle und gleichzeitig pro Zeile noch ein Bild hinzufüge.
Irgendwie stehe ich auf dem Schlauch!


Gruß

Sico

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

20.06.2010, 17:25:48 via Website

Schonmal in die Tutorials geschaut ?

Du erzeugst ein Layout für EINE Zeile und weißt ein Mapping zu, da gibt es verschiedene Möglichkeiten wie z.b das ganze mittels ArrayAdapter oder einem SimpleCursorAdapter zu machen.

Das Layout für eine ListActivty wäre etwa so:

<?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"
android:id="@+id/background_pattern">

<ListView
android:id="@+id/android:list"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

<TextView
android:id="@+id/android:empty"
android:text="@string/no_entrys"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

</LinearLayout>

Wobei der die untere TextView nur benutzt wird wenn die Liste keine Einträge enthält, Android sucht dann im Layout einen View mit entsprechende ID -> android_empty.

Das Mapping ist anfangs mittels eines ArrayAdapters sicher das einfachste, willst du komplexere Views in der List mit Daten füllen ist sicher der SimpleCursorAdapter die treffende wahl. Du erzeugst eine Query auf deine Datenbank, erhälst einen Cursor mit diesem Cusor erzeugst du ein Mapping der Cursor Spalte (from) auf eine View (to) innerhalb deines Layouts was du in der List verwenden willst z.b so:


1private void setupMapping(final Cursor _cursor)
2 {
3 if (_cursor == null)
4 {
5 throw new NullPointerException("Cursor");
6 }
7 // hack
8 if (oldCursor != null)
9 {
10 oldCursor.close();
11 }
12
13 startManagingCursor(_cursor);
14 oldCursor = _cursor;
15
16 final String[] from = new String[]
17 { "name", "minwind", "maxwind", "windmeasure", "starting", "till", "activ" };
18 final int[] to = new int[]
19 { R.id.custom_spotoverview_name, R.id.custom_spotoverview_wind_start, R.id.custom_spotoverview_wind_end,
20 R.id.custom_spotoverview_wind_details, R.id.custom_spotoverview_wind_from,
21 R.id.custom_spotoverview_wind_to, R.id.custom_spotoverview_activ };
22 shows = new SimpleCursorAdapter(this, R.layout.custom_listview_spotoverview, _cursor, from, to);
23 shows.setViewBinder(new SpotOverviewViewBinder());
24 setListAdapter(shows);
25 }

PS: Den Query hab ich hier extra weggelassen da es nicht zum eigentlichen Thema gehört!


hth,
Mac

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

20.06.2010, 17:35:46 via Website

Ich bin dir noch den SpotViewBinder schuldig, dieser regelt das füllen der Daten auf die Views. Wenn ich das gerade richgtig im Kopf habe ist das eine Optionale sache dieser muss also nicht verwendet werden. In meinem Fall war dieser aber von nöten, die Methoden mit ihren parameter : public boolean setViewValue(final View view, final Cursor cursor, final int columnIndex) sollte hier selbst erklärend sein, ich fülle da unter andern Spalten indem Ich Bilder dort einfüge. Hier kommen die Daten aus der Datenbak und in der Spalte steht z.b NW was der Windrichtung Nordwest entspricht, entsprechend besorge Ich mir das Bild und setze das auf meinen ImageView:

1public final class SpotOverviewViewBinder implements SimpleCursorAdapter.ViewBinder
2{
3 /**
4 * Index is depending on SQL column order.
5 */
6 private static final int INDEX_SPOT_NAME = 1;
7 // private static final int INDEX_KEYWORD = 2;
8 private static final int INDEX_WIND_START = 3;
9 private static final int INDEX_WIND_END = 4;
10 private static final int INDEX_WINDUNIT_ID = 5;
11 private static final int INDEX_WIND_DIRECTION_START = 6;
12 private static final int INDEX_WIND_DIRECTION_END = 7;
13 private static final int INDEX_SPOT_ACTIV = 8;
14
15 /**
16 * Converts integer representing a boolean (0,1) of enabled or disabled icon
17 * resource id.
18 *
19 * @param value
20 * @return
21 */
22 private final static int convertIntToResourceID(final int value)
23 {
24 return value == 0 ? R.drawable.activ_off : R.drawable.activ_on;
25 }
26
27 /*
28 * (non-Javadoc)
29 *
30 * @see
31 * android.widget.SimpleCursorAdapter.ViewBinder#setViewValue(android.view
32 * .View, android.database.Cursor, int)
33 */
34 @Override
35 public boolean setViewValue(final View view, final Cursor cursor, final int columnIndex)
36 {
37 if (columnIndex == INDEX_SPOT_ACTIV)
38 {
39 final ImageView iv = (ImageView) view;
40 final int resID = convertIntToResourceID(cursor.getInt(columnIndex));
41 iv.setBackgroundResource(resID);
42 }
43 else if (columnIndex == INDEX_SPOT_NAME)
44 {
45 final String name = cursor.getString(columnIndex);
46 final TextView tv = (TextView) view;
47 tv.setText(name);
48 }
49 else if (columnIndex == INDEX_WIND_START)
50 {
51 final String name = cursor.getString(columnIndex);
52 final TextView tv = (TextView) view;
53 tv.setText(name);
54 }
55 else if (columnIndex == INDEX_WIND_END)
56 {
57 final String name = cursor.getString(columnIndex);
58 final TextView tv = (TextView) view;
59 tv.setText(name);
60 }
61
62 else if (columnIndex == INDEX_WINDUNIT_ID)
63 {
64 final TextView tv = (TextView) view;
65 final String id = cursor.getString(columnIndex);
66 // final WindUnit unit = WindUnit.getById(id);
67 final Measure measure = Measure.getById(id);
68
69 String name = (String) tv.getText();
70 name = name.replace("$measure", measure.name());
71 tv.setText(name);
72 }
73 else if (columnIndex == INDEX_WIND_DIRECTION_START)
74 {
75 final ImageView tv = (ImageView) view;
76 final String id = cursor.getString(columnIndex);
77 final int index = IdentityUtil.indexOf(id, CardinalDirection.values());
78 final int resID = CardinalDirection.values()[index].getImage();
79 tv.setImageResource(resID);
80 }
81 else if (columnIndex == INDEX_WIND_DIRECTION_END)
82 {
83 final ImageView tv = (ImageView) view;
84 final String id = cursor.getString(columnIndex);
85 final int index = IdentityUtil.indexOf(id, CardinalDirection.values());
86 final int resID = CardinalDirection.values()[index].getImage();
87 tv.setImageResource(resID);
88 }
89
90 return true;
91 }
92}

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten