German Listview mehrzeilig

tudorf

Active Member
Licensed User
Longtime User
Hallo

Ich möchte ein Listview mehrzeilg anzeigen lassen.

B4X:
   Dim zeile1 As String
   Dim zeile2 As String


      zeile1 = "Test1 Test2 Test3 Test4 Test5 Test6 Test7 Test8 Test9 Test10"
      zeile2 = zeile1&CRLF&zeile1

      ListView1.AddTwoLines (zeile1,zeile2)
      ListView1.AddTwoLines (zeile1,zeile2)

Die Höhe des Listviewitems lässt sich verändern löst aber nicht mein Problem.

Der Test wir nicht komplett angezeigt.

Wie kann ich das ändern?
MfG Martin
 

Attachments

  • listview.jpg
    listview.jpg
    25.5 KB · Views: 294

klaus

Expert
Licensed User
Longtime User
Leider zeigst Du nicht genug Code um konkret helfen zu können.
Hast Du auch die
ListView1.TwoLinesAndBitmap.Label.Height
ListView1.TwoLinesAndBitmap.SecondLabel.Height
Werte gemäss eingestellt ?

Hast Du auch schon mal die Table Class angeschaut
oder CustomListView Class?

Beste Grüsse.
 

tudorf

Active Member
Licensed User
Longtime User
Hallo Klaus

Mit Label und Secondlabel schein man weiter zu kommen. Ich habe mein Programm wir folgt geändert

B4X:
   ListView1.Initialize("ListView1")    

   Dim Cursor1 As Cursor
   
   
   Cursor1 = Main.SQL1.ExecQuery("SELECT * FROM " & Main.DBTableName)

   Dim zeile1 As String
   Dim zeile2 As String


'   For i = 0 To Cursor1.RowCount - 1      

'      Cursor1.Position = i
      Cursor1.Position = 0
      
      zeile1 = Cursor1.GetString(Main.ColumnName(1))&" "&Cursor1.GetString(Main.ColumnName(10))
      zeile2 = Cursor1.GetString(Main.ColumnName(21))&" m "&CRLF&Cursor1.GetString(Main.ColumnName(18))

      ListView1.AddTwoLines (zeile1,zeile2)    
      
      ListView1.TwoLinesLayout.ItemHeight = 200dip
      
      Dim label1 As Label
      label1 = ListView1.TwoLinesLayout.Label 
      label1.TextSize = 20
      label1.TextColor = Colors.Yellow
      label1.Height=300
      
      Dim label2 As Label
      label2 = ListView1.TwoLinesLayout.SecondLabel
      label2.TextSize = 20
      label2.TextColor = Colors.Red
      label2.Height=300


'   Next
   Cursor1.Close
   
   Activity.AddView(ListView1, 0, 0, 100%x, 100%y )

Die Datenbank ist natürlich vorhanden. Wir geht es um die Höhe der Anzeige.

Mit meinem Progamm sieht das Listview etwas seltsam aus (siehe Bild).

Die Klassen Table und CustomListView hatte ich mir noch nicht angesehen.

Mfg Martin
 

Attachments

  • listview2.jpg
    listview2.jpg
    20.2 KB · Views: 327

klaus

Expert
Licensed User
Longtime User
Das wundert mich nicht.
Du hast eine ListView1.TwoLinesLayout.ItemHeight von 200dip.
Dann setzt Du label1.Height=300 und label2.Height=300 das gibt schon eine Gesamtgrösse von 600 ?!
Und label2.Top ist nicht geändert.
label1.Height=300 in solchen Fällen solltest Du label1.Height=300dip also dip Werte verwenden.

Ich verstehe nicht genau was Du machen willst.
Bin mir auch nicht sicher ob Du verstanden has wie ListView aufgebaut ist.

Wie schon gesagt Du solltest Dir Table und CustomListView anschauen.

Beste Grüsse.
 

tudorf

Active Member
Licensed User
Longtime User
Hallo Klaus

Danke für die Rückantwort.

> Du hast eine ListView1.TwoLinesLayout.ItemHeight von 200dip.
Vom logischen aus hast du recht. Leider arbeitet B4A da nicht logisch oder ich habe die Logik noch nicht gefunden.

Ich habe mal ein paar Ausdrucke beigelegt.
- "Listview Originalhöhe". Hier habe ich nur mit ListView1.AddTwoLines (zeile1,zeile2) zwei Zeilen eingefügt. Es sind knapp 10 Einträge auf meinem Monitor sichtbar. Das verstehe ich auch unter einem Listview. Dieses möchte ich auch so beibehalten nur dass die erste Zeile aus 2 Reihen und die 2 Zeile aus 3 Reihen bestehen kann. Einfach mehr Platz für das was ich anzeigen will.

- "Listview 200". Da die Standardhöhe 100dip beträgt (lt. deinen Unterlagen) habe ich ListView1.TwoLinesLayout.ItemHeight = 200dip. Logisch währe wenn ich nun knapp 5 Einträge sehen würde. Es sind aber nur 3.

- "Listview Label". Hier habe ich die beiden Labelhöhen auf die Iconhöhe angepasst.
B4X:
      ListView1.AddTwoLines (zeile1,zeile2)    
      
      ListView1.TwoLinesLayout.ItemHeight = 300dip
      
      Dim label1 As Label
      label1 = ListView1.TwoLinesLayout.Label 
      label1.TextSize = 20
      label1.TextColor = Colors.Yellow
      label1.Height=150dip
      
      Dim label2 As Label
      label2 = ListView1.TwoLinesLayout.SecondLabel
      label2.TextSize = 20
      label2.TextColor = Colors.Red
      label2.Height=150dip

- "Listview Top" wurde mit Label.top erweitert.
B4X:
      ListView1.AddTwoLines (zeile1,zeile2)    
      
      ListView1.TwoLinesLayout.ItemHeight = 300dip
      
      Dim label1 As Label
      label1 = ListView1.TwoLinesLayout.Label 
      label1.TextSize = 20
      label1.TextColor = Colors.Yellow
      label1.Height=150dip
      label1.Top = 50dip
      
      Dim label2 As Label
      label2 = ListView1.TwoLinesLayout.SecondLabel
      label2.TextSize = 20
      label2.TextColor = Colors.Red
      label2.Height=150dip
      label2.Top = 50dip

Logisch ist für mich, dass ich mit ItemHeight die Höhe des Eintrages verändere und diese untereinander stehen. Mit Label.height verändere ich Einträge bis ich die Höhe von ItemHeight ausgefüllt habe. Diese großen Leerbereich dürften dann nicht entstehen.

Ist Listview dazu in der Lage ??

Gibt es für die beiden anderen Klassen eine deutsche Beschreibung ? Englisch ist nicht so mein Fall.

Wenn Listview das nicht kann bin ich gerne bereit zu wechseln.

MfG Martin
 

Attachments

  • Listview originalhöhe.jpg
    Listview originalhöhe.jpg
    43 KB · Views: 319
  • Listview 200dip.jpg
    Listview 200dip.jpg
    19.6 KB · Views: 259
  • Listview Label.jpg
    Listview Label.jpg
    36 KB · Views: 298
  • Listview Top.jpg
    Listview Top.jpg
    35.5 KB · Views: 273

klaus

Expert
Licensed User
Longtime User
In einer ListView hast Du folgendes (für ein TwoLinesLayout):

1) ListView1.TwoLinesLayout.ItemHeight ist die Höhe eines Eintrages.

2)ListView1.TwoLinesLayout.Label.Top ist die Koordinate des oberen Randes des ersten Labels meistens gleich 0 (0 ist auch der 'default' Wert)

3)ListView1.TwoLinesLayout.Label.Height ist die Höhe des des ersten Labels.

4)ListView1.TwoLinesLayout.SecondLabel.Top ist die Koordinate des oberen Randes des zweiten Labels, um ein Überlappen der Labels zu vermeiden muss ListView1.TwoLinesLayout.SecondLabel.Top mindestens diesen Wert haben ListView1.TwoLinesLayout.SecondLabel.Top = ListView1.TwoLinesLayout.Label.Top + ListView1.TwoLinesLayout.Label.Height
Falls ListView1.TwoLinesLayout.Label.Top = 0 dann kann mas es kürzen auf ListView1.TwoLinesLayout.SecondLabel.Top = ListView1.TwoLinesLayout.Label.Height
ListView1.TwoLinesLayout.SecondLabel.Top kann aber auch höher sein wenn man einen Zwischenspalt will zwischen den Labels möchte.

5)ListView1.TwoLinesLayout.SecondLabel.Height ist die Höhe des des zweiten Labels.

6)ListView1.TwoLinesLayout.ItemHeight muss mindestens folgende Höhe haben um zu verhindern dass das das zweite Label teilweise versteckt ist: ListView1.TwoLinesLayout.ItemHeight = ListView1.TwoLinesLayout.SecondLabel.Top + ListView1.TwoLinesLayout.SecondLabel.Heightd

Alle Einträge haben die gleichen Abmessungen !

In Deinem Fall würde Ich das CustomListView benutzen mit dem kannst Du fast Alles mögliche tun.
Auch die Höhe der einzelnen Einträge an die Länge der Texte anpassen.

Beste Grüsse.
 

tudorf

Active Member
Licensed User
Longtime User
Hallo Klaus

Danke für die ausführliche Antwort. Nun habe ich das verstanden. Es sah zwar nach der Umstellung noch etwas unordentlich aus konnte aber mit label1.Gravity=Gravity.TOP und label2.Gravity=Gravity.TOP gelöst werden.

CustomListView kann ich nicht laden da ich nur die Version 2.25 habe und das Programm eine neuere Version vorraussetzt. Ich muss mal prüfen bis zu welcher Version ich updateberechtig bin.

Ich habe nochmal 2 andere Fragen.
- Ich lade größere Daten in mein Listview. Bei ca 400 Datensätzen dauert da so ca 20 Sek. Um da eine Anzeige zu machen habe ich am Anfang
ProgressDialogShow("Lade Daten...")
eingefügt und am Ende
ProgressDialogHide
Leider wird nicht angezeigt. Wie aktiviere ich diese Anzeige.

- Ich möchte Entfernungen formatiert ausgeben. z.B. "657 m", "17,8 km" oder "164 km". Die Angaben liegen in Metern vor. Ich weiß, dass es da einen Formatfefehl gibt. Finde ihn aber nicht mehr. Nach welchem Befehl muss ich suchen ?

Danke Martin
 
Top