Tabelle in Android Studio?

  • Antworten:9
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 27

16.11.2016 11:13:07 via Website

Hallo Leute :)
Nun bin ich hier frisch angemeldet und hab auch gleich ne Frage!
Undzwar möchte ich gerne meine erste App entwickeln und diese braucht an mehreren Stellen eine Tabelle mit 3 oder 4 Spalten und bis zu 30 oder 40 Reihen (bzw. Listeneinträgen).
Ich hab hier einmal einen Prototypen in Balsamiq Mockups erstellt um meine Vorstellung etwas zu verbildlichen:
image

Angefangen habe ich folgendermaßen:
image

Nun bin ich mir zum Einen nicht sicher ob der Ansatz richtig/gut ist und zum Anderen wie ich weiter vorgehen soll. Undzwar war meine erste Überlegung ein externes Layout zu erstellen mit 4 TextViews, das dann i-wie (ich nehme an über einen Adapter) eine RowView mit dem Inhalt dieses Layouts in die TableView eingefügt wird. Aber das wären dann ca 30x4 also 120 TextViews, was mit Sicherheit viel Speicher frisst und die App arg verlangsamt.. Darum hatte ich mir als zweites überleget eine ListView zu nutzen aber da hab ich keine Ahnung, wie ich da 4 TextViews bzw. 4 Spalten reinbekomme, die alle die selbe Größe haben außer wieder über ein externes Layout mit 4 TextViews. Aber das käme ja aufs Selbe hinaus wie mit den Rows.. :(

Ich würde mich über Tipps und Hilfestellungen sehr freuen :)

Liebe Grüße
Dominic

  • Forum-Beiträge: 2.214

16.11.2016 11:18:49 via Website

Hallo Dominic,

willkommen im Forum

Dein Ansatz ist schon mal grundsätzlich nicht falsch .
Tabellen kannst du ja im SourceCode füllen , warum nicht
.

Darum hatte ich mir als zweites überleget eine ListView zu nutzen aber da hab ich keine Ahnung, wie ich da 4 TextViews bzw. 4 Spalten reinbekomme, die alle die selbe Größe haben außer wieder über ein externes Layout mit 4 TextViews. Aber das käme ja aufs Selbe hinaus wie mit den Rows.. :(

Hier zu benötigst du einen (Base) Adapter, der dann je Row ein "Inflated" Layout hat
(Also ein eigenes Layout je ListView Eintrag)
Ich würde dir empfehlen , das auch mal anzuwenden , weil dir diese Technik recht häufig über den Weg laufen wird ...

Hier mal ein Beispiel
http://androidexample.com/How_To_Create_A_Custom_Listview_-_Android_Example/index.php?view=article_discription&aid=67

— geändert am 16.11.2016 11:30:25

Liebe Grüße - Stefan
[ App - Entwicklung ]

  • Forum-Beiträge: 27

16.11.2016 11:49:36 via Website

Vielen Dank für die schnelle und umfangreiche Antwort! :)
Hilft mir auf jeden Fall schonmal weiter aber die Frage bezüglich des Speichers und ob es die App verlangsamt es auf diese Weise zu machen ist noch offen. Ich möchte dann später die Liste ja ruckelfrei durchscrollen können.

<TableLayout
    android:layout_width="match_parent"
    android:layout_below="@+id/deckliste"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="23dp"
    android:layout_height="110dp"
    android:id="@+id/tableLayout">

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <TextView
            android:layout_height="wrap_content"
            android:id="@+id/kartenname"
            android:text="@string/kartenname"
            android:layout_width="0dp"
            android:layout_weight="0.4"
            android:textSize="14sp"
            android:textStyle="normal|bold" />

        <TextView
            android:text="@string/anzahl"
            android:layout_width="0dp"
            android:layout_weight="0.15"
            android:layout_height="wrap_content"
            android:id="@+id/anzahl"
            android:textStyle="normal|bold" />

        <TextView
            android:text="@string/punkte"
            android:layout_width="0dp"
            android:layout_weight="0.15"
            android:layout_height="wrap_content"
            android:id="@+id/punkte"
            android:textStyle="normal|bold" />

        <TextView
            android:text="@string/aktiviert"
            android:layout_width="0dp"
            android:layout_weight="0.13"
            android:layout_height="wrap_content"
            android:id="@+id/aktiviert"
            android:textStyle="normal|bold" />

    </TableRow>

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

    </TableRow>

</TableLayout>

Das ist mein TableLayout und in die zweite Row überlege ich nun die ListView einzufügen oder aber halt ne Karte und dann jedes mal ne neue Row pro Karte aber das wäre glaube ich ziemlich heftig bzw. würde die App mit Views überladen..^^

  • Forum-Beiträge: 2.214

16.11.2016 11:54:05 via Website

Hallo Dominic,

Ich möchte dann später die Liste ja ruckelfrei durchscrollen können.

Genau da liegt der Knackpunkt und dafür ist ein Baseadapter da ...

Der Baseadapter lädt die erforderlichen Inhalte "nach", wenn sie in dem ViewBereich gescrollt werden.
Typisches Beispiel :
Du hast nicht nur Textviews , sondern Bitmaps - Bei 1000 Bitmaps würde das den Rahmen sprengen.

Ergo übergibst du dem Adapter ein Array und der entscheidet ,was er an Resourcen zur Anzeige benötigt
und dass er flüssig bleibt .
Normalerweise die Anzahl die sichtbar ist und jeweils ein Offset davor und dahinter .
Zumal du jede Menge Eingriffsmöglichkeiten als Entwickler hast.

Ich würde dir also empfehlen , dich auf ein Custom-Listview und Baseadapter einzuschiessen.

Bei richtig verzwickten Sachen , (die viel Speicher benötigen) bedient mal sich dann einem anderen SpeicherManagement (LruCache)

— geändert am 16.11.2016 13:13:36

Liebe Grüße - Stefan
[ App - Entwicklung ]

  • Forum-Beiträge: 27

16.11.2016 20:38:44 via Website

Jaaa danke :) Mit der Info lässt sich schonmal sehr gut arbeiten!^^
Also statt ner TableView einfach ne ListView, Größe davon anpassen und mit nem BaseAdapter die Einträge reinladen (oder die ListView in ne Row?). Stellt sich mir noch die Frage, wie ich die Listeneinträge dazu bringe alle die selbe Größe in den TextViews zu haben. Kann ich das einfach wie in der Row mit weight machen? Und meinst du mit Custom ListView einfach ne ListView, wo ich mit ner layout XML die Einträge customize? Sorry falls ich dumme Fragen stelle aber manche Sachen sind mir einfach noch nicht ganz klar^^'

Liebe Grüße

— geändert am 16.11.2016 20:40:18

  • Forum-Beiträge: 2.214

16.11.2016 20:51:33 via Website

Na das sind keine dummen Fragen :-)
Da sind wir hier weit "aussergewöhnliches" gewohnt :-)

Du bist auf dem richtigen Wege -
Das Layout welches du im Adapter für eine Zeile verwendest, kannst du "designen" , wie du magst
es ist ja ein eigenes Layout . (auch mit weight)

Und im Baseadapter, in der Funktion getView kannst du dann noch zur runtime customizen :
Farbe, Grösse etc - was immer du zu deinem Glück benötigst :-)

Wenn bei dir der Groschen gefallen ist , wie er richtig funktioniert , wirst du deine wahre Freude dran haben

— geändert am 16.11.2016 20:54:08

Liebe Grüße - Stefan
[ App - Entwicklung ]

  • Forum-Beiträge: 27

16.11.2016 21:11:49 via Website

Haha dann bin ich ja beruhigt (whew)
Ich weiß noch nicht genau, was du mir sagen möchtest..^^' Soll ich nun die TableView in die Tabelle einfügen und in einem externen Layout die Listeneinträge "designen" und mit dem Adapter reinladen oder die ganze ListView in ein externes Layout auslagern? :) Wobei zweiteres ziemlich absurd klingt.. :D

  • Forum-Beiträge: 2.214

16.11.2016 21:40:56 via Website

Nee nee , ANSTATT der Tabelle nimmst du ein ListView mit Baseadapter - kommt aufs Gleiche raus
Deine Spalten machst du dann mit dem "inflated" layout

— geändert am 16.11.2016 21:42:30

Liebe Grüße - Stefan
[ App - Entwicklung ]

  • Forum-Beiträge: 27

16.11.2016 22:12:17 via Website

Achsooooo! :D Habs kapiert^^
Hätte noch ein paar weitere Fragen, die aber kaum mehr was mit der Ursprungsfrage zu tun haben.. Magst die vllt auch noch beantworten oder soll ich dafür neue Threads öffnen?^^

  • Forum-Beiträge: 2.214

16.11.2016 22:14:59 via Website

wenns komplett was Anderes ist - neuen Thread bitte

und den hier machst du dann auf "beantwortet"

Und dann antworte ich dir auch gerne darauf :-)

— geändert am 16.11.2016 23:21:15

Liebe Grüße - Stefan
[ App - Entwicklung ]