ListView-Einträge mit unterschiedlichen Templates

  • Antworten:3
Hermann S.
  • Forum-Beiträge: 45

28.11.2011, 21:32:31 via Website

Hallo, ich möchte eine ListView erstellen, in die man Einträge mit unterschiedlichen Templates hinzufügen und entfernen kann.
Beispiel Liste:
  • [Bild, Text]
    [Bild, Progressbar]
    [Text, Text]
    [Bild, Bild, Text]
    ...

Ich weiß, dass man für speziellere Listen-Einträge einen eigenen Adapter erstellen kann. In den bisher gefundenen Beispielen, habe ich nur Adapter gesehen, die auf eine einzelne Template ausgelegt waren. Die Einträge in einer solchen Liste sehen demnach alle gleich aus, z.B [Bild2, Text][Bild2, Text][Bild3, Text]..

Die wichtigste Frage ist, geht mein Vorhaben überhaupt mit einer ListView?
Falls ja, hat jemand ein Tipp für mich, wie man das realisieren könnte?

— geändert am 28.11.2011, 21:34:56

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

28.11.2011, 21:41:48 via App

Hey,
klar geht das. Ich würde mir dazu einen CustomAdapter bauen, der je nach Datensatz eine andere View zurückgibt.
Lg Ansgar

Philip M.

Antworten
Jenny S.
  • Forum-Beiträge: 8

29.11.2011, 12:20:01 via Website

Hi,

Einen Custom Adapter erstellst du in etwa so:

  1. Du erstellst eine XML-Datei mylistitem.xml mit dem Layout, welches für jeden Listeneintrag genutzt werden soll.

    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"
    4 android:layout_height="match_parent"
    5
    6 <ImageView
    7 android:id="@+id/listitem_image"
    8 android:layout_width="wrap_content"
    9 android:layout_height="wrap_content" />
    10
    11 <TextView
    12 android:id="@+id/listitem_text"
    13 android:layout_width="match_parent"
    14 android:layout_height="wrap_content"" />
    15</LinearLayout>
  2. Du erstellst eine Klasse MyAdapter, welche den Adapter für deine ListView bereitstellt:

    1[...]
    2public class MyAdapter extends BaseAdapter implements ListAdapter {
    3 private Context context;
    4 private String[] listEntries;
    5
    6 public MyAdapter(Context c, String[] listEntries) {
    7 this.context = c;
    8 this.listEntries = listEntries;
    9 }
    10
    11[...]
    12
    13 public View getView(int position, View convertView, ViewGroup parent) {
    14 LayoutInflater inflater = (LayoutInflater) context
    15 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    16 View rowView = inflater.inflate(R.layout.mylistitem, parent, false);
    17 TextView tvText = (TextView) rowView.findViewById(R.id.listitem_text);
    18 ImageView ivIcon = (ImageView) rowView.findViewById(R.id.listitem_image);
    19 tvText.setText(listEntries[position]);
    20 ivIcon.setImageResource(context.getResource().getDrawable(R.drawable.someicon);
    21
    22 return rowView;
    23 }
  3. In deiner Activity setzt du den Adapter deines ListView auf deinen Custom Adapter:

    1String[] someListEntries = ("List1", "List2");
    2
    3ListView listview = (ListView) findViewById(R.id.mylistview);
    4listview.setAdapter(new MyAdapter(this, someListEntries));

Jetzt kannst du natürlich dem Adapter nicht nur einen String[] geben, sondern ein eigenes Objekt. In deinem Adapter kannst du dann unterscheiden, welche XML-Datei du als Layout für den Listeneintrag nehmen möchtest, oder welches Image, oder, oder, oder...

Gruß, Jenny

Antworten
Hermann S.
  • Forum-Beiträge: 45

02.12.2011, 00:48:23 via Website

Danke Euch. Hab den CustomAdapter mit multiplen Layouts hinbekommen. Hätte nicht gedacht, dass man für jedes Listitem einfach so ein beliebiges Layout setzen darf. Es ist eine Liste mit Options-Feldern. Jedes Feld hat ein individuelles Layout mit je 2-5 Buttons, Spinnern oder/und Seekbars. Insgesamt wird die Liste 10-20 solcher Optionsfelder enthalten. Die Views dieser ganzen Layouts anzusprechen wird meinen Adapter noch mächtig auf-blähen :).

Antworten