French B4A : élargir l'ascenceur d'une CLV

zed

Well-Known Member
Licensed User
La solution donnée ne fonctionnera qu'avec B4J. Il n'y a pas de CSS avec Android.
Peut-être q'avec JavaObject tu pourrais modifier le style du ScrollView.
Essaye ceci.
ScrollView Size:
Dim jo As JavaObject = XCustomListView1
Dim sv As JavaObject = jo.RunMethod("getScrollView", Null)

' Modifier la largeur de la barre de défilement
sv.RunMethodJO("setScrollBarSize", Array(15)) ' 15 est un exemple, ajuste selon tes besoins
 

CR95

Active Member
Licensed User
Merci zed de ton retour rapide (je suis effectivement en B4A).

Je viens d'essayer ton code avec ma CLV :
B4X:
Public CLVRep As CustomListView   
...
Dim jo As JavaObject = CLVRep

Et j'ai une erreur dans l'IDE (soulignée en violet) sur la seconde ligne : "Les types ne correspondent pas"
Si je compile malgré tout, j'ai une erreur à l'exécution, :
java.lang.RuntimeException: Method: getScrollView not found in: b4a.example3.customlistview

Ce qui me semble relativement cohérent.

SI j'essaie de déclarer (comme toi) ma CLV avec un "X" devant CustomListView (pour éliminer l'erreur de types qui ne correspondent pas)
B4X:
Public CLVRep As XCustomListView
j'ai une erreur : "Type inconnu : xcustomlistview"

J'ai bien attaché la bibliothèque xCustomListView 1.73

As tu une idée de comment m'en sortir ?

Encore merci
 

zed

Well-Known Member
Licensed User
J'ai fait une erreur. Excuse-moi.
Ceci fonctionne très bien. Il faut utiliser la lib JavaObject.
ScrollBar width:
Sub Globals
    'These global variables will be redeclared each time the activity is created.
    Private CustomListView1 As CustomListView
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("Layout")
    CustomListView1.AddTextItem("1",1)
    CustomListView1.AddTextItem("2",2)
    CustomListView1.AddTextItem("3",3)
    CustomListView1.AddTextItem("4",4)
    CustomListView1.AddTextItem("5",5)
    CustomListView1.AddTextItem("6",6)
    
    Dim jo As JavaObject = CustomListView1.sv
    ' Modifier la largeur de la barre de défilement
    jo.RunMethodJO("setScrollBarSize", Array(150)) ' 15 est un exemple, ajuste selon tes besoins
End Sub
 

Attachments

  • ScrollBarWidth.png
    ScrollBarWidth.png
    31.7 KB · Views: 79

CR95

Active Member
Licensed User
Encore une fois, merci de ta réactivité

OUI, la dernière proposition fonctionne !

Mais à l'affichage de la CLV, mon ascenceur (bien élargi) "remonte" puis devient un petit rectangle en haut à droite puis s'efface ????
C'est similaire à l'affichage d'un répertoire de fichiers dans Windows quand il y a énormément de fichiers dans le répertoire ; on voit l'ascenceur monter et se raccourcir.

Il semble que cette "remontée" coïncide avec le chargement des éléments inférieurs de la CLV (non affichés).

As-tu une idée de ce qui arrive ?

Et enfin (quand on tient un expert sous la main...), existe-il une fonction Java similaire pour changer la couleur de l'ascenceur ?

Pour info, j'ai essayé de diminuer la largeur des items lors de leur chargement dans la CLV (en me disant qu'ils empiètent à droite sur l'ascenceur) mais cela ne change rien.
 

zed

Well-Known Member
Licensed User
puis devient un petit rectangle en haut à droite puis s'efface
Probablement qu'il y a beaucoup d'item.
Il semble que cette "remontée" coïncide avec le chargement des éléments inférieurs de la CLV (non affichés).
Exact.

Pour la couleur.

ScrollBar Color:
Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("Layout")
    CustomListView1.AddTextItem("1",1)
    CustomListView1.AddTextItem("2",2)
    CustomListView1.AddTextItem("3",3)
    CustomListView1.AddTextItem("4",4)
    CustomListView1.AddTextItem("5",5)
    CustomListView1.AddTextItem("6",6)
    
    Dim jo As JavaObject = CustomListView1.sv
    ' Modifier la largeur de la barre de défilement
    jo.RunMethodJO("setScrollBarSize", Array(150)) ' 15 est un exemple, ajuste selon tes besoins
    
    'Changer la couleur de la barre de défilement
    ChangeScrollBarColor(CustomListView1.sv, Colors.Red)
End Sub

Sub ChangeScrollBarColor(sv As ScrollView, color As Int)
    Dim jo As JavaObject = sv
    jo.RunMethod("setVerticalScrollBarEnabled", Array(True))
    Dim bar As JavaObject = jo.RunMethod("getVerticalScrollbarThumbDrawable", Null)
    If bar.IsInitialized Then
        bar.RunMethod("setColorFilter", Array(color, "SRC_IN"))
    End If
End Sub
 

CR95

Active Member
Licensed User
Merci beaucoup
Probablement qu'il y a beaucoup d'item.
Effectivement, il y a beaucoup d'items.
J'ai refait un essai avec 50 lignes et le phénomène (remontée puis disparition) subsiste.
Par contre, j'ai découvert que si je fais glisser manuellement la CLV sur l'écran, l'ascenceur réapparait.... et redisparait !
En fait, il indique quelle est la position verticale de la partie affichée par rapport à toute la hauteur de la CLV.
Alors que je voudrais l'utiliser comme ascenceur pour me déplacer dans la CLV.

Pour la couleur.
J'ai l'erreur "java.lang.RuntimeException: Method: getVerticalScrollbarThumbDrawable not found in: anywheresoftware.b4a.objects.ScrollViewWrapper$MyScrollView" sur la ligne
B4X:
Dim bar As JavaObject = jo.RunMethod("getVerticalScrollbarThumbDrawable", Null)

A cet instant, et sans vouloir t'importuner, mais en même temps, tu maitrises tellement bien Java :
- existerait-il une fonction (Java j'imagine) pour garder permanent l'affichage du curseur de l'ascenceur ?
 

zed

Well-Known Member
Licensed User
Ce n'est pas possible d'empêché le système de masqué définitivement la ScrollBar.
Mais c'est possible de contourner le problème en augmentent le délais avant le fondu.

View Scrollbar:
 ' Affichage permanent de la barre de défilement
SetPermanentScrollbar(CustomListView1.sv)

Sub SetPermanentScrollbar(vScrollView As View)
    Dim jo As JavaObject = vScrollView
    jo.RunMethod("setVerticalScrollBarEnabled", Array(True)) ' Active la barre de défilement
    jo.RunMethod("setScrollBarDefaultDelayBeforeFade", Array(9999999)) ' Empêche la disparition
End Sub


Si tu as beaucoup d'Item à charger, je te conseil d'utilisé le chargement différé.
Voir ceci.
 

zed

Well-Known Member
Licensed User
J'ai l'erreur "java.lang.RuntimeException: Method: getVerticalScrollbarThumbDrawable not found in: anywheresoftware.b4a.objects.ScrollViewWrapper$MyScrollView" sur la ligne
Qu'elle version de JavaObject tu utilises ?
JavaObject 2.06 fonctionne très bien sur SDK 34.
Ne fonctionnera pas en dessous de SDK21
Manifest:
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="34"/>
 

CR95

Active Member
Licensed User
OUI, l'affichage permanent marche avec ta modif.

OUI, je connais (et j'utilise) le "lazy loading".

Je suis en SDK 28 car j'utilise cette appli sur un (relativement) vieux téléphone sur lequel je ne peux pas faire de mise à niveau.

Ça va marcher comme ça. Merci d'avoir passé tout ce temps à m'aider
 

fgh3966

Active Member
Licensed User
Bonjour
Idée : Est ce que tu ne pourrais pas disons filtrer les items les + importants ? Ce qui ferait dimminuer la taille de la CLV
 
Top