German Welche Tabellen-Lösung nehmen?

JOTHA

Well-Known Member
Licensed User
Hallo Community,

ich möchte eine Anwesenheitsliste (für ca. 8 - 20 Personen) in einer App anzeigen lassen, deshalb soll eine horizontal scrollbare und durch Anklicken aus einem Auswahlmenü befüllbare Tabelle generiert werden.

1) die Tabelle soll in A1 den Monat anzeigen. Beispiel: 04.19 (Apr) = April 2019. Der Monat soll vorher über ein Menü ausgewählt werden.

2) als 1. Header sollen von B1 bis AF1 die passenden Wochentage (von Mo - So) zum Datum befüllt werden.

3) als 2. Header soll von B2 bis max. AF2 das passende Datum befüllt werden, wobei der Januar eben 31 Tage hat und der Februar manchmal nur 28 oder 29 Tage (Schaltjahr) hat. Die Tabelle soll dann automatisch "abgeschnitten" werden.

4) ab A3 sollen dann in der Spalte A die Personen automatisch eingetragen werden (und dann nicht mehr anklickbar sein), die Daten kommen aus einer SQL oder wahlweise einer Textdatei. Die Tabelle soll dann ebenfalls automatisch unten "abgeschnitten" werden.

Tabelle Anwesenheitsliste - 1.jpg


5) die Datenfelder ab B3 bis AF ... sollen anklickbar sein, damit man aus einem weiteren Auswahlmenü bestimmte Buchstaben eintragen kann, z.B. x = anwesend ... oder K = krank, u.s.w. ... Samstag und Sonntag sollen standardmäßig nicht anklickbar sein und deshalb anders eingefärbt sein.

6) nach dem Anklicken der Auwahl sollen die Felder noch eingefärbt werden, d.h. Textfarbe und -hintergrund sollen automatisch geändert werden.

Tabelle Anwesenheitsliste - 2.png


Siehe Bilder ... und jetzt frage ich mich, mit welcher Tabellen-Lösung ich am besten beginne?
* Wer hat Erfahrungen mit horizontal scrollbaren und befüllbaren Tabellen?

Mir geht es nicht um eine komplette Lösung (das bekomme ich schon hin), sondern um die Information, mit welchen Tools ich das alles realisieren kann.

Über eine kleine Anschubhilfe würde ich mich sehr freuen ... ;-)
 

DonManfred

Expert
Licensed User
Das wird so nicht passen ohne weiteres.
Ein paar anmerkungen:

- Du sollte vermutlich besser das ganze "Wöchentlich" anzeigen. Da reicht eine Bildschirmbreite nämlich aus um alle Daten anzuzeigen. Du könntest dann ein vertikal scrollbare liste anzeigen. Auch wenn es 40 personen wären.

Wenn es aber unbedingt Horizontal scrollbar sein muss:

Du kannst ein xCustomListview verwenden und es so einstellen, dass es Horizontal scrollbar ist. Dann dürfen die rows im gesammten natürlich nicht mehr als platz auf dem Bildschirm ist. Könnte bei 20 Teilnehmerns evtl. schon klapp werden (schätze ich), wenn man die Spalten dann evtl. auch noch anklicken will.

Ich denke, dass du mit xCustomListview aber wohl die besten chancen hast, das umzusetzen, was dir da vorschwebt. Es ist Horizontal nutzbar und Du bist hier recht ungebunden. Du musst dir halt für die einzelnen Zeilen einsprechende Layouts bauen.
 

klaus

Expert
Licensed User
Ich hatte so etwas vor etlichen Jahern in VB6 für PC gemacht.
Ich hatte Alles grafisch gemacht.

Für Deinen Fall kenne ich keine Tabellen Library die das direkt machen kann.

Du kannst entweder xCustomListView oder ScrollView2D nehmen.
ScrollView2D hat den Vorteil dass es in beide Richtungen scrollbar ist.
Jedes mal wenn Du einen neuen Monat auswählst musst Du die Tabelle entweder neu aufbauen oder zu mindest die nötigen oder unnötigen Views anzeigen oder nicht.

Ich würde es mit einer ScrollView2D machen.
 

JOTHA

Well-Known Member
Licensed User
Hallo DonManfred und klaus,
vielenDank für eure Antworten!

@DonManfred ... an eine xCustomListView habe ich auch zuerst gedacht, da ich sehr wahrscheinlich nur horizontal scrollen muss.

Bei einer wöchentlichen Darstellung müsste ich jedesmal die Teilnehmerliste für jede Woche neu erstellen und das nimmt ja vom Bildschirm auch wieder eine Menge Platz weg, außerdem wird es dann schon etwas unübersichtlicher.

Soweit ich weiß, könnte ich ja in einer xCustomListView auch noch mehrere horizontalScrollView einbauen, oder?

@klaus: die ScrollView2D ist eine sehr interessante Variante, wenn ich noch Platz nach unten brauchen würde. Diese kann ich sicher noch in einem anderen Bereich brauchen.

Meine eigentliche Frage zielte aber in Richtung "Tabellen.Lib", damit meine ich, ob es eine Art von Tabelle gibt die sich anhand der Daten automatisch aufbaut und ich nicht jedes Kästchen extra zeichnen muss ... Aber so etwas gibt es anscheinend leider nicht?
 

klaus

Expert
Licensed User
Meine eigentliche Frage zielte aber in Richtung "Tabellen.Lib"
Das hatte ich verstanden.
Aber so etwas gibt es anscheinend leider nicht?
Und meine Antwort: Für Deinen Fall kenne ich keine Tabellen Library die das direkt machen kann.
 
Last edited:

mw71

Active Member
Licensed User

klaus

Expert
Licensed User

JOTHA

Well-Known Member
Licensed User
Hallo mw71 und klaus,

mit B4XTable habe ich schon herumexperimentiert, da stört mich auch, dass man diese durchblättern muss. Ausserdem brauche ich in dieser Tabelle keine Suchfunktion und soweit ich das mitbekommen habe, lässt sich die "Überschrift" mit der Blätter- und Suchfunktion auch nicht ausblenden oder anders umgestalten. Das würde mir also nur Platz wegnehmen.

Mit der Class FlexibleTable habe ich jetzt auch schon 3 Stunden herumgespielt ... bis ich jetzt die Antwort von klaus gelesen habe.

Ich werde jetzt einfach mal 31 Labels (x Teilnehmer-Anzahl + 2 x für Header) auf ein Panel in einer HorizontalScrollView legen ... damit müsste sich alles realisieren lassen.
 

klaus

Expert
Licensed User
... auf ein Panel in einer HorizontalScrollView legen.
Ich würde ScrollView2D nehmen, da hast Du das senkrechte scrollen gleich mit.
ScrollView2D hat auch ein internes Panel wie ScrollView oder HorizontalScrollView.
Der Aufbau in ScrollView2D ist der Gleiche wie in HorizontalScrollView.
Den Aufbau würde ich im Programm erstellen mit verschiedenen For / Next Loops.
 

JOTHA

Well-Known Member
Licensed User
OK klaus (Du hast mich überzeugt :)), ich probiere das mit der ScrollView2D mal aus!
 

klaus

Expert
Licensed User
Ist das was Du suchst?
Ich habe ein bisschen mit Deinem Problem gespielt.
Ich habe nicht Alles getestet.

upload_2019-4-29_21-26-13.png
 

Attachments

JOTHA

Well-Known Member
Licensed User
Hallo klaus,

vielen lieben Dank für deine Mühe! ... das war aber nicht nur mal ein bischen "gespielt" ... und sieht ja schon hammermässig aus!
Leider kommt aber bei mir ein Fehler, anbei siehe LOG:
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
main_activity_create (java line: 374)
java.lang.RuntimeException: java.lang.NoSuchMethodException: _initialize [class anywheresoftware.b4a.BA, class java.lang.Object, class java.lang.String]
at anywheresoftware.b4a.keywords.LayoutBuilder.loadLayout(LayoutBuilder.java:170)
at anywheresoftware.b4a.objects.ActivityWrapper.LoadLayout(ActivityWrapper.java:209)
at b4a.Anwesenheitsliste.main._activity_create(main.java:374)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:196)
at b4a.Anwesenheitsliste.main.afterFirstLayout(main.java:104)
at b4a.Anwesenheitsliste.main.access$000(main.java:17)
at b4a.Anwesenheitsliste.main$WaitForLayout.run(main.java:82)
at android.os.Handler.handleCallback(Handler.java:836)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6310)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1084)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:945)
Caused by: java.lang.NoSuchMethodException: _initialize [class anywheresoftware.b4a.BA, class java.lang.Object, class java.lang.String]
at java.lang.Class.getMethod(Class.java:1981)
at java.lang.Class.getMethod(Class.java:1637)
at anywheresoftware.b4a.objects.CustomViewWrapper.AfterDesignerScript(CustomViewWrapper.java:64)
at anywheresoftware.b4a.keywords.LayoutBuilder.loadLayout(LayoutBuilder.java:162)
... 14 more
... und noch eine Frage dazu: In #SupportedOrientations ist "landscape" eingetragen. Würde das sicher auch in "portrait" klappen?
 

klaus

Expert
Licensed User
Welche Androidversion benutzt Du? Ich habe 9.01.2
Welche ScrollView2D Version hast Du? Ich habe 1.30
portrait funktioniert auch., Du kannst ohne weiteres 'unspecified' eingeben.
Ich habe landscape eingegeben weil die Tabelle meistens breiter als höher ist.
 

JOTHA

Well-Known Member
Licensed User
Android Version 7.1.1
ScrollView2D Version 1.10

... dann werde ich jetzt gleich mal die ScrollView2D Version aktualisieren ;).

--> nach der Aktualisierung auf Version 1.30 funktioniert es!

Vielen Dank klaus!!! :)
 
Last edited:

klaus

Expert
Licensed User
Ich hab noch ein bisschen weiter gespielt.
Die erste Version zeigt dass man so was relativ leicht selbst machen kann.
Die Tabelle musste bei jeder Änderung neu erstellt werden.
Die zweite, beiliegende, Version ist etwas besser erstellt, haupsächlich für Datenverwaltung.
Solange die Anzahl der Personen gleich bleibt brauch man die Tabelle nicht mehr neu zu erstellen.
Alle Labels sind leicht ansprechbar mit bekannten Namen einzeln oder Arrays.
Die Jahr nd Monat Anzeige ist ausserhalb der ScrollView und immer sichtbar.
Die Tage oben, bleiben immer sichtbar und scrollen nur waagrecht mit der ScrollView.

upload_2019-4-30_16-21-6.png
 

Attachments

JOTHA

Well-Known Member
Licensed User
Hey klaus,

du bist spitze!
Ich habe auch an der Tabelle weitergetüftelt (siehe ZIP) ...
Die Tabelle musste bei jeder Änderung neu erstellt werden.
... als ich das Datum über einen Spinner ausgewählt habe war das so, dass die Tabelle quasi neu erstellt werden musste.
Die Tage oben, bleiben immer sichtbar ...
... genau das wollte ich auch noch programmieren ... jetzt kann ich mir das anschauen, wie Du es gemacht hast. SUPER!
Vielen Dank nochmals!
 

Attachments

JOTHA

Well-Known Member
Licensed User
Geht das mit dem Fixieren auch für die erste Spalte (so wie bei Excel)?
Dann würde ich die Teilnehmer-Spalte mit Textumbruch schmaler machen, und dafür aber die Höhe und Breite der Spalten erhöhen.

P.S.: Mit DateMonth = DateTime.Date(DateTime.Now) startet die Tabelle immer zum aktuellen Datum.

Momentan tüftle ich an der Teilnehmer-Liste.
Du hast Dir die Mühe gemacht, das man die Teilnehmer anklicken kann, aber das sollte keine Option sein, denn die Teilnehmer sich fest "gebucht" und sollen aus einer SQL ausgelesen werden. Nach dem Auslesen würde ich diese dann mit Row.Count durchzählen um die Gesamtanzahl der Zeilen zu generieren.
 
Last edited:

klaus

Expert
Licensed User
Geht das mit dem Fixieren auch für die erste Spalte (so wie bei Excel)?
Ja, aber mit dem gleichen Nachteil wie mit den beiden ober Zeilen mit den Tagen, die scrollen nur wenn man die ScrollView scrollt.
Ich hatte mal versucht zwei ScrollViews zu synchronisieren, das hat aber nie richtig geklappt.
P.S.: Mit DateMonth = DateTime.Date(DateTime.Now) startet die Tabelle immer zum aktuellen Datum.
Daran hatte ich auch gedacht, hatte es aber vergessen einzubauen.
Du hast Dir die Mühe gemacht, das man die Teilnehmer anklicken kann, aber das sollte keine Option sein,
Habe ich nur als Anregung eingebaut, um zu zeigen wie man es macht.

Für das fixieren der ersten Spalte, ich hatte auch daran gedacht, aber das fehlen des Scrolling hatte mich davon abgehalten.
Willst Du versuchen das selbst einzubauen, auf dem gleichen Prinzip wie die oberen Zeilen?
Oder möchtest Du dass ich es mache?
Wenn ja, dann müssen wir uns mit den Projekten synchronisieren.
 
Top