Android ListFragment

speedy_g

Mitglied
Moin,

ich habe da mal eine Verständnisfrage zum ListFragment.

Wird das in richtigen/professionellen Apps überhaupt verwendet oder nimmt man das maximal per Copy&Paste als Vorlage für ein eigenes Fragment?

Meine Frage kommt daher - ich entwickel schon ziemlich lange Software und wollte mich jetzt auch mal mit der App-Programmierung beschäftigen. Dann bin ich natürlich auch über die Empfehlung, ein ListFragment zu verwenden, gestolpert ... und natürlich auch über das Problem, daß die id id/list sein muß. Genauso muß aber auch die Textview für eine leere Liste "empty" heißen etc. - also die ganzen IDs sind hardgecodet ... waren da irgendwelche unerfahrenen Jungprogrammierer (überspitzt gesagt) dran, die das entwickelt haben? Wenn man schon sowas baut, sollte man doch eigentlich solche IDs definierbar machen, damit man die Klasse auch besser einsetzen kann? Mit hardgecodeten IDs kann man doch nur eine Liste in der App haben oder kenne ich den Trick noch nicht? Wenn ich z.B. eine Liste für Kategorien habe, möchte ich ja auch gerne sagen "Liste der Kategorien ist leer" und dann eine weitere Liste mit z.B. Anzeigen "Liste der Anzeigen ist leer" - mit einer hardgecodeten Empty-ID ist das doch aber nicht möglich.

MFG
speedy
 

buggy84

Bekanntes Mitglied
also die ganzen IDs sind hardgecodet

ja, die ID´s werden, in so ziemlich jedem Element in Android fest vergeben. Dass es hier "feste" ID`s gibt, sehe ich nicht als schlimm an.

Wenn man schon sowas baut, sollte man doch eigentlich solche IDs definierbar machen, damit man die Klasse auch besser einsetzen kann?

Hier habe ich entweder die Frage nicht ganz verstanden, oder Du hast das mit dem Fragment noch nicht so ganz verstanden.

Die Daten, die in der ListView angezeigt werden, kannst Du während der Laufzeit eintragen.
Sehr vereinfacht dargestellt referenziert man nicht das ListView, sondern eher die Elemente, die in der ListView stehen.

Hier mal ein kleines Beispiel
http://www.worldbestlearningcenter.com/tips/Android-ListFragment-example.htm

waren da irgendwelche unerfahrenen Jungprogrammierer (überspitzt gesagt) dran

ich glaube nicht, dass das das Resultat eines Projekttages "Schaulgarten" in einer Aschaffenburger Grundschule war...
 

speedy_g

Mitglied
ja, die ID´s werden, in so ziemlich jedem Element in Android fest vergeben. Dass es hier "feste" ID`s gibt, sehe ich nicht als schlimm an.

Das Stichwort hier ist Wiederverwendbarkeit. Wieso programmiert man denn in Klassen etc. und wozu gibt es Fragmente ... damit man den Source, die Klasse, das Objekt oder was auch immer woanders wiederverwenden kann und nicht per Copy&Paste alles doppelt hat.

Hier habe ich entweder die Frage nicht ganz verstanden, oder Du hast das mit dem Fragment noch nicht so ganz verstanden.

Die Daten, die in der ListView angezeigt werden, kannst Du während der Laufzeit eintragen.

Aber was würdest du jetzt machen, wenn du 2 ListViews haben möchtest, die unterschiedlich aussehen sollen?

Mal ein Beispiel - als Vorwarnung, keine Ahnung ob man einer ListView eine Farbe geben kann, ich verwende es aber mal als Beispiel - also nicht dran stören, wenn das gar nicht so geht.


Ich habe Gemüse. Also baue ich eine Klasse "Gemüse". Jetzt setze ich bei der Verwendung welches Gemüse es ist und die Farbe vom Gemüse. Ich habe also Kartoffeln und die sind braun und dann habe ich Tomaten die sind rot. So macht man es doch in der Programmierung.

Jetzt habe ich eine ListView-Klasse und möchte die für unterschiedliche Dinge einsetzen. Ich habe also jetzt 2 ListViews zu bauen. In der einen möchte ich die Namen der prämierten Kartoffeln (Ein ganz offensichtlicher Anwendungsfall :) ) auflisten und irgendwo anders in der App die andere ListView mit den Fotos der prämierten Tomaten. Also baue ich eine ListView und möchte hier im Layout definieren, daß die ListView braun ist und ich baue eine zweite ListView und möchte die Farbe rot haben.(das ist mein Beispiel ohne Wissen ob das geht - laß es die Ausrichtung der Liste sein oder was auch immer - Farben sind aber bildlicher - Voraussetzung ist, ich möchte es im Layout definiert haben) Bedeutet für mich jetzt aber, ich bräuchte ein ListView-Layout für die Kartoffeln mit der id/ListViewKartoffeln und eine mit der id/ListViewTomaten. Das ist so aber nicht möglich.

Ein weiteres Beispiel hierzu, das auch wirklich funktioniert. Wenn die ListView leer ist, also noch keine Namen aufgelistet sind, kann man eine empty-TextView definieren, in der dann ein Text steht - bei den Kartoffeln möchte ich natürlich den Text haben "Keine Kartoffelnamen vorhanden". Bei den Tomaten aber "Keine Tomaten vorhanden". Um diese beiden Texte "hardgecodet" per Layout definieren zu können, bräuchte ich aber 2 TextViews mit unterschiedlichen Id's. Das ListFragment läßt aber nur die hardgecodete ID "id/empty" zu.

Viel offensichtlicher aus meiner Sicht wäre, wenn es Setter-Methoden für die IDs geben würde wie SetListViewID, SetEmptyID etc. Das würde die Grundidee der Wiederverwendbarkeit eher wiederspiegeln.

Hoffe das war jetzt verständlicher?


MFG
speedy
 

buggy84

Bekanntes Mitglied
Gut, Du hast jetzt einfach verdeutlicht, was Du von OO verstehst. Soweit ja alles gut.

Du scheinst nur Layout und Objekte irgendwie zu verwechseln. Das eine hat mit dem anderen nicht so viel zu tun. Eine ListView ist nur eine Möglichkeit, Daten sichtbar zu machen. Android bietet extremst viele Möglichkeiten, Views anzupassen. Da gibt es u.a. Shapes, Styles, Gradients etc etc etc. Die kannst Du alle erstellen und Du kannst diese auch wiedervenden. Und genauso verhält es sich auch hier. Du hast quasi einen Container, in den Du alles reinbauen kannst was Du willst. Eine wie ich finde nahezu perfekte Auseinandersetzung mit diesem Thema findest Du hier:

http://www.vogella.com/tutorials/AndroidListView/article.html

So eine Abhandlung könnte man über jedes einzelne View erstellen, es würde sich aber, aufgrund der hohen Flexibilität viel wiederholen.

Du musst das System noch durchschauen, ich glaub da liegt der Hund begraben. Und das mit Layouts nicht mit dem Standard OO verwechseln.

Bedeutet für mich jetzt aber, ich bräuchte ein ListView-Layout für die Kartoffeln mit der id/ListViewKartoffeln und eine mit der id/ListViewTomaten. Das ist so aber nicht möglich.

Brauchst Du nicht, weil der Inhalt das Aussehen bestimmt.
 

speedy_g

Mitglied
Deinen Link von Vogella hatte/habe ich hier auf und arbeite den gerade auch schon durch. :)

Brauchst Du nicht, weil der Inhalt das Aussehen bestimmt.

Versuchen wir es mal mit einem Beispiel aus Vogella:

Code:
<ListView
  android:id="@android:id/list"
  android:layout_width="match_parent"
  android:layout_height="wrap_content" >
</ListView>

Die Kartoffeln benötigen bei der Width z.B. ein match_parent. Die Tomaten z.B. ein fill_parent.(Keine Ahnung ob das Sinn macht, aber angenommen das ist die Anforderung) Wie würdest du das hier dann bei ein und derselben Layout-Definition machen?


MFG
speedy
 

buggy84

Bekanntes Mitglied
Neue Layout Definition. Weißt Du, ich kann nunmal meinen 40-Tonner nicht in einer Handelsüblichen Fertiggarage abstellen, obwohl sich 40-Tonner von "Fahrzeug" ableitet und Fahrzeuge in die Fertiggarage gestellt werden.
 

speedy_g

Mitglied
Neue Layout Definition.

Hmm ja, hätte ich auch selber drauf kommen können. :)

Was mich jetzt aber ein bißchen verwirrt - und zwar habe ich ja die ListView als ListFragment ... in irgendeinem Tutorial (finde ich gerade nicht mehr in meinen tausend Fenstern) wurde dafür eine content_main.xml angelegt (vielleicht wurde es ja auch vom AndroidStudio angelegt, weil ich was mit Fragment für das Projekt ausgewählt hatte?) .. jedenfalls steht da u.a. das drin:

Code:
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fragment"
...
    tools:layout="@layout/fragment_main" />

Und dann gibt es das fragment_main.xml mit u.a. folgendem:

Code:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
...
    tools:showIn="@layout/content_main">

Die beiden XMLs verweisen also aufeinander ... wenn ich jetzt eine neue fragment_main.xml für ein anderes ListView-Layout mache (das fragement_main wird ja dann für die ListView als Layout im Java-Source angegeben), wird in der content_main natürlich auf die falsche XML verwiesen.

Müssen diese gegenseitigen Verweise sein oder sind die überflüssig?


MFG
speedy
 

buggy84

Bekanntes Mitglied
Nein, muss nicht sein. Es kommt hier auf den Anwendungsfall an. Fragments können auch dynamisch zugeordnet werden. Das ist, denke ich, sogar der Regelfall.
 

Neue Themen


Oben