ListView mit 2 Einträgen

  • Antworten:4
kruemelnerd
  • Forum-Beiträge: 52

07.10.2011, 16:48:12 via Website

Moin,

also in meiner App kommt eine ListView vor, welche das Wochenmenü eines Lokals anzeigt.

Erzeugt wird das ganze beim starten der ListActivity und zwar mit einem SetListAdapter ( setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, array_essen_woche)); )
Die einzelnen Einträge sind dabei in list_item.xml. Da ist einfach nur eine TextView drin.


Nun will ich das ganze aber ein wenig ändern. Und zwar dahin das in list_item.xml nicht nur eine, sondern zwei TextViews angezeigt werden, siehe dazu die Beispielskizze. Einmal das Datum und einmal die Menübeschreibung. Diese Sachen stehen relativ einfach in zwei String-Arrays drin.

Aber irgendwie steh ich grad aufm Schlauch und bekomm es einfach nicht hin die Arrays ordentlich an die ListView zu übergeben.
Hat jemand ein Beispiel oder einen Hinweis für mich, um mir zu helfen?



Danke

Antworten
Kullorki
  • Forum-Beiträge: 55

07.10.2011, 20:56:22 via Website

dazu musst du deinen eigenen adapter machen
in etwa so

1setListAdapter(new MeinArrayAdapter<String>(this, R.layout.meinlist_item,Array1,Array2));
dann halt die klasse MeinArrayAdapter

1public class meinArrayAdapter<ViewHolder> extends ArrayAdapter<String>
2{
3 private LayoutInflater mInflater;
4
5 public meinArrayAdapter(Context context,int id,String[] array1,String [] array2)
6 {
7 super(context,id);
8 mInflater = LayoutInflater.from(context);
9 }
10
11 @Override
12 public View getView(int position, View convertView, ViewGroup parent)
13 {
14 // textview füllen
15
16 return convertView;
17 }
18
19
20 public int getCount()
21 {
22 return array.length
23 }
24
25
26 class ViewHolder
27 {
28 TextView tw2;
29 TextView tw1;
30 }
31 }
das ganze ist pseudo code, nicht getestet...


mfg

— geändert am 07.10.2011, 20:59:48

Antworten
kruemelnerd
  • Forum-Beiträge: 52

10.10.2011, 11:58:33 via Website

Ah doch jetzt kommts wieder. Das mit der eigenen Klasse hab ich irgendwie verdrängt.
Danke.

Antworten
kruemelnerd
  • Forum-Beiträge: 52

10.10.2011, 22:29:05 via Website

So hab mich nochmal ein wenig schlau gemacht und bin auf folgende Lösung gekommen.
Statt mit einer CustomClass habe ich doch auf den SimpleAdapter verwendet. Folgende Seiten haben das ganz gut beschrieben:
http://www.heikkitoivonen.net/blog/2009/02/15/multicolumn-listview-in-android/
http://mylifewithandroid.blogspot.com/2008/03/my-first-meeting-with-simpleadapter.html

Hier auch noch mal mein Code, falls jemand ein ähnliches Problem hat.


1public class wochen_anzeige extends ListActivity {
2
3 @Override
4 public void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6
7 // Die übergebenen Daten aus dem Intent holen
8 Bundle extras = getIntent().getExtras();
9 String[] essen_woche = extras.getStringArray("ESSEN_WOCHE");
10 String[] datumnamen_woche = extras.getStringArray("DATUMNAMEN_WOCHE");
11 String[] datum_woche = extras.getStringArray("DATUM_WOCHE");
12
13 // Ab hier jetzt verarbeiten und an die ListView übergeben
14
15 // ArrayList die aus mehreren HashMaps besteht
16 ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
17 // HashMap, welche aus 2 Strings besteht (key + value)
18 HashMap<String, String> map;
19
20 // Die Daten anpassen und in der HashMap speichern
21 for (int i = 0; i < 4; i++) {
22 map = new HashMap<String, String>();
23 // Das Datum schön angepasst in das Datumsfeld schreiben
24 map.put("datum", datumnamen_woche[i + 1] + " (" + datum_woche[i + 1] + ")");
25 // Die Essensbeschreibung in das Beschreibungsfeld kopieren.
26 map.put("beschreibung", essen_woche[i + 1]);
27 mylist.add(map);
28 }
29
30 // Den SimpleAdapter erstellen
31 SimpleAdapter mSchedule = new SimpleAdapter(this, mylist, R.layout.list_item, new String[] { "datum",
32 "beschreibung" }, new int[] { R.id.list_item_datum, R.id.list_item_beschreibung });
33
34 // Den SimpleAdapter in der ListActivity setzen
35 setListAdapter(mSchedule);
36 }
37}

list_item.xml
1<?xml version="1.0" encoding="utf-8"?>
2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="match_parent" android:layout_height="wrap_content"
4 android:orientation="vertical" >
5
6 <TextView android:id="@+id/list_item_datum" android:textSize="16sp"
7 android:textStyle="bold" android:layout_width="match_parent" android:layout_marginTop="10px"
8 android:layout_height="wrap_content" android:background="@color/gruen"></TextView>
9
10 <TextView android:id="@+id/list_item_beschreibung"
11 android:textSize="16sp" android:layout_width="match_parent"
12 android:layout_height="wrap_content"></TextView>
13</LinearLayout>

komplette_woche_anzeigen.xml
1<?xml version="1.0" encoding="utf-8"?>
2<ListView xmlns:android="http://schemas.android.com/apk/res/android"
3 android:id="@+id/list_wochen_anzeigen" android:orientation="vertical"
4 android:layout_width="match_parent" android:layout_height="match_parent">
5</ListView>


Vielleicht hilft es ja jemandem :)

Antworten
Anne S.
  • Forum-Beiträge: 1

20.02.2013, 16:36:49 via Website

Hallo, bin neu hier, und hoffe es ist ok, wenn ich einen etwas älteren Beitrag aus der Versenkung hole.

Ich habe eine ähnliche Problemstellung wie kruemelnerd und wollte seinen Vorschlag umsetzen. Jedoch bringt mir Eclipse dabei einen Fehler.
Der Fehler taucht auch auf, wenn ich es so wie in den beiden Tutorials beschrieben umsetze. In meinem Fall ist es ein RSS-Feed den ich parse und in eine ListView ausgeben möchte.

Mein Code (aufs Wesentliche gekürzt):
1public class RSSMain extends Activity {
2 private ListView liste;
3 private static Content myContent;
4
5 @Override
6 public void onCreate(Bundle savedInstanceState) {
7 super.onCreate(savedInstanceState);
8 setContentView(R.layout.activity_rssmain);
9
10 liste =(ListView)findViewById(R.id.feedListe);
11 myContent = new Content();
12 new ReadRssFeedTask(this).execute();
13 }
14
15 private class ReadRssFeedTask extends AsyncTask<Void,Void,Void> {
16 public ReadRssFeedTask(Activity activity) {
17 ..............
18 }
19 protected void onPreExecute() {
20 ..............
21 }
22 @Override
23 protected Void doInBackground(Void... tmp){
24 ..............
25 }
26
27 @Override
28 protected void onPostExecute(Void result){
29
30 //liste mit Daten füllen
31 List<String> rssteaser = myContent.getSummary();
32 List<String> rssimage = myContent.getImgLink();
33 List<String> rssdate_update = myContent.getUpdated();
34 List<String> rssdate_publish = myContent.getPublished();
35 List<String> rssauthor = myContent.getAuthor();
36 List<String> rsstitle = myContent.getTitel();
37 List<String> rsscontent = myContent.getContent();
38
39 // Ab hier jetzt verarbeiten und an die ListView übergeben
40 // ArrayList die aus mehreren HashMaps besteht
41 ArrayList<HashMap<String, List<String>>> mylist = new ArrayList<HashMap<String, List<String>>>();
42 // HashMap, welche aus 2 Strings besteht (key + value)
43 HashMap<String, List<String>> map;
44
45 // Die Daten anpassen und in der HashMap speichern
46 for (int i = 0; i < rsstitle.size(); i++) {
47
48 map = new HashMap<String, List<String>>();
49
50 // Das Datum schön angepasst in das Datumsfeld schreiben
51 map.put("datum", rssdate_update);
52 // Die Essensbeschreibung in das Beschreibungsfeld kopieren.
53 map.put("beschreibung", rssteaser);
54 mylist.add(map);
55 }
56
57 // Den SimpleAdapter erstellen
58 SimpleAdapter mSchedule = new SimpleAdapter(this, mylist, R.layout.listview_layout, new String[] { "datum",
59 "beschreibung" }, new int[] { R.id.date, R.id.teaser });
60
61 /* HIER WIRD FOLGENDER FEHLER ANGEZEIGT: "The constructor SimpleAdapter(RSSMain.ReadRssFeedTask, ArrayList<HashMap<String,String>>, int, String[], int[]) is undefined" */
62
63 // Den SimpleAdapter in der ListActivity setzen
64 liste.setAdapter(mSchedule);
65
66 }
67 }
68}

Ich bin noch ziemlich am Anfang in der Android-Programmierung.
Wie kann ich denn diesen Fehler beheben?

EDIT:
Ich habs auch mit dem Code von Kullorki versucht:

1public class RSSMain extends Activity {
2.............
3@Override
4 protected void onPostExecute(Void result){
5liste.setAdapter(new RSSListAdapter<String>(RSSMain.this, R.layout.image_text_layout, myContent.getImgLink(), myContent.getUpdated(), myContent.getPublished(), myContent.getAuthor(), myContent.getTitel(), myContent.getSummary(), myContent.getContent()));
6}
7.............
8}

1public class RSSListAdapter<ViewHolder> extends ArrayAdapter<String>
2{
3 private LayoutInflater mInflater;
4 private ImageView imageView;
5 private TextView textView_title;
6 private TextView textView_date;
7 private TextView textView_creator;
8 private TextView textView_teaser;
9 private TextView textView_content;
10 private TextView textView_imagelink;
11
12 public RSSListAdapter(Context context,int id, List<String> imagelink, List<String> date_updated, List<String> date_published, List<String> author, List<String> title, List<String> summary, List<String> content){
13
14 super(context,id);
15 mInflater = LayoutInflater.from(context);
16
17 }
18
19 @Override
20 public View getView(int position, View convertView, ViewGroup parent){
21
22 //textview füllen - aber wie?
23 imageView = (ImageView) convertView.findViewById(R.id.feed_image);
24 textView_title = (TextView) convertView.findViewById(R.id.job_title);
25 textView_date = (TextView) convertView.findViewById(R.id.job_date);
26 textView_creator = (TextView) convertView.findViewById(R.id.job_creator);
27 textView_teaser = (TextView) convertView.findViewById(R.id.job_teaser);
28 textView_content = (TextView) convertView.findViewById(R.id.job_content);
29 textView_imagelink = (TextView) convertView.findViewById(R.id.job_imagelink);
30
31 return convertView;
32 }
33
34
35// public int getCount()
36// {
37// return array.length
38// }
39
40 class ViewHolder{
41 TextView textView_title;
42 TextView textView_date;
43 TextView textView_creator;
44 TextView textView_teaser;
45 TextView textView_content;
46 TextView textView_imagelink;
47 }
48
49}

Im Prinzip habe ich das ja glaube ich schon etwas verstanden, nur wie ich an die "List<String>"-Elemente komme verstehe ich nicht. Dem "super(context,id);" kann ich noch einen weiteren Parameter übergeben, aber leider keine 7 weitere um alle "List<String>"-Elemente abzudecken.

Wie komm ich denn nun an die "List<String>"-Elemente ran um die Views zu füllen?

Welche Variante wäre denn eigentlich grundsätzlich zu empfehlen?
Der Code von kruemelnerd oder der von Kullorki?

— geändert am 20.02.2013, 17:04:44

Antworten