Custom Scrollview

S

swordi

Enthusiast
447
Hallo

Ich habe folgendes:

*) ScrollView
*) Darin ein RelativeLayout in dem ich beliebige Views untereinander anordne.

Ich benötige folgendes:

Wird eine neue View angeordnet, möchte ich, dass die ScrollView diese immer nach ganz oben scrollt.
Das heißt die letzte View, die ganz unten, ist am oberen Rand sichtbar. Der User kann dann aber händisch noch weiter nach oben scrollen.

Die ScrollView scrollt ja immer erst, wenn alles voll ist und dann auch nur bis das letzte Elemente sichtbar ist und nicht weiter.

Hat jemand eine Idee oder gibts für sowas schon eine Custom Komponente ?

Vielen Dank schonmal
 
keiner einen anhaltspunkt ?
 
Mir fällt nur ein unter das zuletzt eingefügte View noch ein leeres dummy view einzufügen welches den freien Platz bis zum unteren Rand verbraucht und dieses dann beim einfügen des nächsten Elements wieder zu entfernen... naja suboptimal halt.
 
  • Danke
Reaktionen: swordi
ja so ähnlich hab ich das schon probiert. ist leider, wie du sagst, suboptimal
 
Wie muss man sich Deine Views vorstellen, also rein von den Dimensionen her? Komplett zufällige Maße? Hatte eben gerade schon ne wall of text geschrieben, dann ist mein Browser abgeschmiert und ich hab keine Lust, alles zu wiederholen, daher wäre es hilfreich, wenn Du etwas konkreter fragen könntest.
Die einzelnen Views dürften ja dann schon mal nicht breiter sein als die aktuelle Breite Deines RelativeLayouts, wenn ich Dich richtig verstanden habe. Denn sonst hättest Du ja auch noch einen horizontalen Scrollbar. Wie ist es mit der Höhe Deiner Views? Kleiner gleich oder größer als die Höhe des übergeordneten Containers? Oder gänzlich unterschiedlich?

Der ursprüngliche Beitrag von 12:25 Uhr wurde um 12:43 Uhr ergänzt:

Ach so, grad erst beim wiederholten lesen gemerkt: von vertikalen Scrollbars allein war ja auch nicht wirklich die Rede.
Sorry, aber ich fürchte, Du solltest also doch zumindest ein klein wenig konkreter werden, damit ich mir irgendwas bildlich drunter vorstellen kann...
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: swordi
ja ich kanns nochmal etwas detaillierter beschreiben:

der User gibt Texte ein und erhält andere texte. Dazu hab ich eine View, die wahrscheinlich 90% des Screens einnehmen wird. Wie groß genau sollte ja keine Rolle spielen.

Am einfachsten ein Beispiel:

*) User gibt Hallo ein
*) Hallo wird auf die View geschrieben - als TextView am einfachsten.
*) App berechnet was und schreibt "Begrüßung" hin. direkt unter das Hallo
*) in manchen Fällen wird noch etwas darunter geschrieben. Sagen wir mal "Grün"

Also steht am Bildschirm

Hallo
Begrüßung
Grün

untereinander.

Jetzt gibt der User "Ciao" ein.
Ciao soll am Bildschirm unten angehängt werden. Es soll aber soweit gescrollt sein, dass genau dieses Ciao ganz oben am Rand des Views liegt. Der User kann aber per wischen die älteren Texte dann noch erreichen.

Es muss nur jeweils der letzte Text ganz oben, alleine sichtbar sein.

ist irgendwie sehr schwer zu beschreiben :D hoffe das hilft ein wenig fürs verständnis


Seitliches scrollen gibt es nicht. Die einzelnen Texte sind kleiner als die gesamte Ansicht.
 
Ja, das macht's schon ein klein wenig anschaulicher. Also rein vom ersten Bauchgefühl her und vorausgesetzt ich hab Dich wirklich korrekt verstanden, seh ich jetzt erstmal auf Anhieb keine grundsätzliche Hürde, sowas zu machen. Leider reichts von meiner Seite im Moment grad erstmal nur nur nem vagen Denkanstoß, weil ich mit meinem eigenen Kram derzeit etwas vom Zeitplan abgekommen bin... :sad:
Bekannt ist Dir ja auf jeden fall schon mal die Maße des Bildschirms. Daher würde ich zuerst den ScrollView + textEdit(Deine Texteingabe) + send button entsprechend generieren + positionieren. Innerhalb des ScrollViews erzeugst Du dann dynamisch dein RelativeLayout, bindest es per addView(...) an Dein ScrollView. Natürlich musst Du auch noch dynamisch Deine TextViews generieren und wiederum an Dein RelativeLayout binden.
ScrollView und RelativeLayout sind beide aus ViewGroup abgeleitet, welche meines (gefährlichen Halb-)Wissens nach ineinander beliebig verschachtelbar sind. Somit sehe ich bei der Erzeugung und Verknüpfung der UI-Elemente erstmal keine generelle Hürde. Und die Verschiebung des RelativeLayouts innerhalb der ScrollView (damit immer nur die letzte Nachricht, die sich am unteren Rand des RelativeLayout befindet, am oberen Rand des ScrollView angezeigt wird) eigentlich nur noch reine Frage der simplen Mathematik.
Eventuell würde ich mir sogar noch AsyncTask anschauen, weil Du ja von beliebig vielen Views gesprochen hattest, die ja dann auch noch dynamisch erzeugt werden. Das hat den Vorteil, dass Du das ganze oben Beschriebene auslagern kannst, also Deine App selbst während dessen nicht einfriert oder gar noch ANR (appl. not responding) Meldungen erzeugt.

Der ursprüngliche Beitrag von 18:04 Uhr wurde um 18:30 Uhr ergänzt:

Hmm... bei genauerer Überlegung ist mir jetzt, glaube ich, Dein eigentliches Problem bewusst geworden: Du möchstest grundsätzlich einen ScrollView dazu bringen, dass er Dir ein letztes (beliebiges) direktes Child-Element (in diesem Fall das RelativeLayout) so positioniert, dass nur noch der untere Rand des RelativeLayout-Child sichtbar ist, an dem sich wiederum dessen letzter Child-View (in diesem Fall Dein letzter TextView) befindet. Aber das dürfte höchstens über irgendwelche exotischen Attribute des ScrollView gehen, weil das irgendwie gegen die grundlegende Funktionsweise eines Scrollbar verstoßen würde, dessen obere und untere bzw. rechte und linke Slider-Kante die Kante des darin enthaltenen Child-View darstellen (weiss nicht, ob das verständlich genug ausgedrückt war). Oder steh ich immer noch aufm Schlauch? ^^
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: swordi
so danke mal für deine überlegungen. mittlerweile hab ich es schon gelöst.

falls es wen interessiert. keine ahnung ob das jemals jemand braucht.

Ich hab mir eine Struktur angelegt, die ein paar TextViews zusammenfasst.
Die zusammengehörenden TextViews ( in der Beschreibung oben schrieb ich nur von einer TextView - spielt aber keine Rolle ob eine oder mehrere ) werden in ein LinearLayout eingefügt.

Dieses wird im RelativLayout ganz unten angefügt. größe des LL ist größe der gesamten View. Nach dem einfügen scroll ich in der Scrollview komplett nach unten.

Wenn ich nun eine neue View einfüge, dann ändere ich die höhe des vorigen Views auf wrap_content. bei der neuen view mach ich das gleich wie vorher beschrieben.

so hab ich immer die neuste view sichtbar, der user kann aber alte einträge scrollen.

ist wohl sehr kompliziert zu beschreiben. ich denke mal die lösung wird auch niemals jemand benötigen, aber usability mäßig brauch ich das genau so.

vielen dank trotzdem
 
  • Danke
Reaktionen: marb0 und StefMa
´Na gut, so langsam hab ich auch verstanden, was Du bezwecken wolltest. :smile: Der Tag war gestern nur irgendwie zu lang, deswegen stand ich erstmal etwas aufm Schlauch.

Gut, dass Du nicht nur selbst auf die Lösung gekommen bist, sondern noch paar Sätze dazu geschrieben hast. Gibt nämlich nix schlimmeres, als wenn man ein exotisches Problem hat, genau dazu auch irgendwo einen veralteten Foren-Thread findet, wo das Problem gelöst wurde, aber kaum was über die Lösung geschrieben wurde... :sleep:
 

Ähnliche Themen

J
Antworten
2
Aufrufe
981
justinh13
J
J
Antworten
2
Aufrufe
690
JoEntwickler
J
Zurück
Oben Unten