Problem with Listview TextSize & Item Heights

HKing

New Member
Licensed User
Longtime User
Hi,

I played around with Listview TextSize & Item Heights but I never made it to get as a result alsways for *all* items the wanted text size..

..why??

Here's the code:
B4X:
Sub Button1_Click
   ListView1.Clear
   
   ListView1.SingleLineLayout.ItemHeight = 15
   ListView1.SingleLineLayout.Label.TextSize = 12 ' this one should be enough, shouldn't it?
   For i=0 To 30
     ListView1.SingleLineLayout.Label.TextSize = 12 ' ...just desparation...
    ListView1.AddSingleLine("This is entry "& i)
   Next    
   ListView1.SingleLineLayout.Label.TextSize = 12
   ListView1.Invalidate
End Sub

and that's the result:
- see list.jpg -

..but why?
 

Attachments

  • list.jpg
    list.jpg
    34.5 KB · Views: 685

devlei

Active Member
Licensed User
Longtime User
Hi King

I'm not sure if this is relevant to your problem, but I also struggled with getting Listview's to display the way I wanted on different devices with different resolutions. With Klaus' help I wrote a short procedure that allows you to specify text size (& padding) and then have item height etc calculated to match. I place this procedure in a code module and then use it from any module while setting the listview properties - before adding items. It is especially useful when the Listview (and other views) size & positioning are set to relative percentages (%X & %Y) of the activity height & width.

Here is the procedure:
B4X:
Sub SetLVHeights4TextSize(LV As ListView, TwoLine As Boolean, Text1Size As Float, Text2Size As Float, Padding As Float)
   If TwoLine = True Then
      LV.TwoLinesLayout.Label.Top = 0
      LV.TwoLinesLayout.Label.TextSize = Text1Size 
      LV.TwoLinesLayout.Label.Height = (Text1Size + (2 * Padding)) * Density
      LV.TwoLinesLayout.SecondLabel.Top = LV.TwoLinesLayout.Label.Height
      LV.TwoLinesLayout.SecondLabel.TextSize = Text2Size 
      LV.TwoLinesLayout.SecondLabel.Height = (Text2Size + (2 * Padding)) * Density
      LV.TwoLinesLayout.ItemHeight = LV.TwoLinesLayout.Label.Height + LV.TwoLinesLayout.SecondLabel.Height
      LV.TwoLinesLayout.Label.Gravity = Gravity.CENTER_VERTICAL
      LV.TwoLinesLayout.SecondLabel.Gravity = Gravity.CENTER_VERTICAL
   Else
      LV.SingleLineLayout.Label.Top = 0
      LV.SingleLineLayout.Label.TextSize = Text1Size
      LV.SingleLineLayout.Label.Height = (Text1Size + (2 * Padding)) * Density
      LV.SingleLineLayout.ItemHeight = LV.SingleLineLayout.Label.Height
      LV.SingleLineLayout.Label.Gravity = Gravity.CENTER_VERTICAL
   End If
End Sub
 
Last edited:
Upvote 0

jsk001

Member
Licensed User
Longtime User
Hi friends,

i need urgently help to solve a Problem.
I've written a small app with a Listview (Twoline Layout)
On some devices it works absolutely fine (resolution upto 800x472)
but on one device Samsung wit a resolution greather then 1900
the entries in the listview are displayed incorrect. I cannot test it on
this device (device of a friend - Hometown has 400km distance).
I hope you can help me.

B4X:
Sub Globals
    Dim PhoneList As ListView
    Type ListViewData (FirstRow As String,   SecondRow As String)
End Sub

Sub Activity_Create(FirstTime As Boolean)

        Activity.LoadLayout("Test")
    SetLVHeights4TextSize(PhoneList,True,16,16,8)
    PhoneList.TwoLinesLayout.SecondLabel.TextColor = Colors.Yellow
    PhoneList.FastScrollEnabled=True
End Sub

HiRes Device greather 1900.png
 
Last edited:
Upvote 0

jsk001

Member
Licensed User
Longtime User
Unfortunately you don't show us enough code.
What does the SetLVHeights4TextSize(PhoneList,True,16,16,8) routine do ?
Are the values 16, 16, 8 dimensions ?
If yes you need to use dip values (not for text size).


...sorry, pls. have look at the one item higher in this thread
Hallo Klaus, ich bin des englischen nicht so perfkt mächtig.
Es währe toll, wenn wir ev. deutsch weitermachen könnten.
LG
 
Upvote 0

jsk001

Member
Licensed User
Longtime User
Viel besser ist dein deutsch allerdings auch nicht :D

PS: Du hättest auch einfach ´nen Thread im deutschen Forum aufmachen können. Da reden wir alle in deutsch. ;-)

Entschuldigung, wenn es nicht korrekt ist, daß ich hier nachfrage.
Ich habe diesen Thread gewählt, weil ich genau diese Routine (siehe oben) verwende.

Sub SetLVHeights4TextSize(LV AsListView, TwoLine As Boolean, Text1Size As Float, Text2Size As Float, Padding As Float)

Ich wollte meine Frage dort stellen, wo sie meines Erachtens nach am besten passt
und am schnellsten kompetent beantwortet werden kann.
Wenn das nicht OK ist kann ja ev. jemand von den Admins den Thread dorthin verschieben
wo es besser passt.

ps. Ich denke mein Deutsch ist eigentlich recht gut, aber naja, Tippfehler passieren
halt manchmal ...sorry ;-)
 
Upvote 0

DonManfred

Expert
Licensed User
Longtime User
Entschuldigung, wenn es nicht korrekt ist, daß ich hier nachfrage.
Es hat niemand gesagt daß der englische Bereich "falsch" sei.
Ich wollte meine Frage dort stellen, wo sie meines Erachtens nach am besten passt
In einem drei Jahre alten Thread?
Dein anliegen ist ein neues; es hat bestimmt nichts mit der Situation des TO vor drei Jahren gemeinsam :)

Ich denke mein Deutsch ist eigentlich recht gut, aber naja, Tippfehler passieren
Ich konnte nicht widerstehen ;)
Und ja; Tippfähler passieren :)
 
Upvote 0

jsk001

Member
Licensed User
Longtime User
Can you post a small project, as a zip file, showing the problem.

Kannst Du ein kleines Projekt, welches das Problem zeigt, als zip Datei posten.

Ich habe mal nur die Phonelist in das Projekt gepackt.
Auf mehreren Samsung Galaxy mit Auflösungen bis 800 x*** tritt der Fehler (siehe Bild oben)
nicht auf. nur bei einem Samsung Gerät mit einer einer Auflösung von über 1900 x *** werden
die Listeneinträge jeweils nur halb angezeigt.

...Danke für die Hilfe im Voraus ...

.ps. Ich habe das Sample geupdatet. Es enthält jetzt die komplette Routine zum skalieren
(aus dem Forum). Ich kann die Ursache des beschriebenen Fehlers einfach nicht finden.
 

Attachments

  • SampleListview.zip
    466.3 KB · Views: 272
Last edited:
Upvote 0

klaus

Expert
Licensed User
Longtime User
Sorry, but I can't help more, I don't have a Samsung device with a bigger screen than 1900 * xxx.
On my Sony xperia z1 with a 1920 * 1080 screen the routine works OK.

Ich kann da nicht weiter helfen, habe kein Samsung Gerät mit über 1900 * xxx Bildschirm.
Auf meinem Sony xperia z1 mit 1920 * 1080 Bildschirm funktioniert die Routine OK.
 
Upvote 0

jsk001

Member
Licensed User
Longtime User
Ich bedanke mich dennoch recht herzlich für Deine Bemühungen.
Ich bin auch etwas ratlos, wo die Ursache sliegen könnte.
Ich denke, ich werde mir dann doch mal ein Gerät mit einer größeren
Auflösung holen müssen, um damit debuggen zu können.

Also nochmals vielen Dank und einen schönen Tag noch.
 
Upvote 0

klaus

Expert
Licensed User
Longtime User
You have updated your last post while I was posting my previous post.
I tested the routine in post #4 and this works.

Now I tested your test project from post #12 and see the problem.
You haden't told us that you are using the Scale Module !!!
In your project remove this line and you get what you want, the Scale module adapts also the TextSize.
SetLVHeights4TextSize(PhoneList,True,16,16,8)

Du hast deinen Post ergänzt während Ich meinen Post schrieb.
Ich hatte die Routine aus Post #4 getetet und diese funktionierte wie erhofft.

Jetzt habe Ich dein Testprojekt aus Post #12 getested und sehe das Problem.
Du hattest uns nicht gesagt dass Du das Scale Modul benutzt !!!
In deinem Testprojekt nehme dies Zeile weg, das Scale Modul adaptiert auch die Textgrösse.
SetLVHeights4TextSize(PhoneList,True,16,16,8)
 
Upvote 0

jsk001

Member
Licensed User
Longtime User
You have updated your last post while I was posting my previous post.
I tested the routine in post #4 and this works.

Now I tested your test project from post #12 and see the problem.
You haden't told us that you are using the Scale Module !!!
In your project remove this line and you get what you want, the Scale module adapts also the TextSize.
SetLVHeights4TextSize(PhoneList,True,16,16,8)

Du hast deinen Post ergänzt während Ich meinen Post schrieb.
Ich hatte die Routine aus Post #4 getetet und diese funktionierte wie erhofft.

Jetzt habe Ich dein Testprojekt aus Post #12 getested und sehe das Problem.
Du hattest uns nicht gesagt dass Du das Scale Modul benutzt !!!
In deinem Testprojekt nehme dies Zeile weg, das Scale Modul adaptiert auch die Textgrösse.
SetLVHeights4TextSize(PhoneList,True,16,16,8)

Hallo Klaus,
recht herzlichen Dank, für die große Mühe die Du dir mit mir gemacht hast.
Ich werde die Änderung in meinem Projekt vornehmen und die .apk meinem
Bekannten zum testen schicken.
Also nochmals ein dickes Dankeschön für Deine Hilfe.
Ich reporte dann das Ergebnis.

LG jsk001
 
Upvote 0

klaus

Expert
Licensed User
Longtime User
I had a closer look at your project because the routine should work.
When you copy code from somewhere you must copy it correctly !!!
In the code in post #4 there is for example this line:
LV.TwoLinesLayout.Label.Height = (Text1Size + (2 * Padding)) * Density
But in your test project you have:
LV.TwoLinesLayout.Label.Height = (Text1Size + (2 * Padding))
Why ? You don't multiply by the Density !!!
Are you sure that you want the same dimensions for all screen sizes ?

Ich habe noch mal näher in dein Testprojekt reingeschaut denn die Routine sollte eigentlich funktionieren.
Wenn Du Code von irgendwo kopierst musst Du diesen auch komplett kopieren !!!
Im Code in Post #4 gibt es, zum Beispile, diese Zeile:
LV.TwoLinesLayout.Label.Height = (Text1Size + (2 * Padding)) * Density
Aber in deinem Testprojekt hast Du:
LV.TwoLinesLayout.Label.Height = (Text1Size + (2 * Padding))
Warum ? Du multipliziert nicht mit Density !!!
Bist Du sicher dass Du die gleichen Masse für alle Bildschirmgrössen willst ?
 
Upvote 0

jsk001

Member
Licensed User
Longtime User
Es ist in der Tat so wie Du schreibst.
Ich habe den Code aus einem älteren Projekt in das neue kopiert und
mir ist die fehlende "Density" einfach nicht aufgefallen.
...Flüchtigkeitsfehler oder Betriebsblindheit....
Ich danke Dir in jedem Fall für den Hinweis und werde die
entsprechenden Korrekturen einarbeiten. :):):)
 
Upvote 0
Top