Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

help listview comment s'y prendre pour ...

1 réponse
Avatar
Vincent
Bonjour,

j'affiche dans une listwiew des imagettes, quand il y en a 300 le temps
d'affichage est très long.

je voudrai au départ n'afficher que les images visibles, si ma listview
affiche 20 imagetttes, je désire afficher
les 20 premieres imagettes. Et afficher le reste que quand je déplace
l'ascenceur de la listview.
Existe t'il une méthode préconisée ? une astuce ?

comment savoir si une imagette est visible ou pas dans la listview ?

merci

Vincent

1 réponse

Avatar
Gilles TOURREAU
Bonjour Vincent,

Utilises l'evenement Invalidate de ton ListView, qui est appellé à
chaque fois que ton ListView doit être redessiné.
Tu peux utiliser ensuite la méthode : GetItemRect(int i) qui permet de
récuperer une zone Rectangle où est placé ta i-ème image.
Tu devra cette zone et tester s'il y a intersection avec la zone
Rectangle qui est envoyé à l'evenement Invalidate de ta ListView, si
c'est le cas, l'image i doit être dessiné...

Je te donne un exemple de code que j'ai tapé directement et que je
n'ai pas testé :

ListView l = new ListView();
string[] images = new string[300];

//Chargement du tableau des images
images[0] = "1.jpg";
images[1] = "2.jpg";

//Brancher l'evenement Invalidated
l.Invalidated += new InvalidateEventHandler(redessine);

private redessine(object sender, InvalidateEventArgs e)
{
int i;

//On parcourt tous les objets de ta liste
for(i = 0; i < 300; i++)
{
Rectangle r;
r = GetItemRect(i);

//On regarde si il y a intersection entre la zone ou l'image doit
// être dessinée et la zone invalide.
if (r.IntersectWith(e.InvalidRect))
DessinerFichierImage(images[i]);
}
}

Tu peux soit charger les images à chaque fois qu'elle doivent être
déssinée, soit les charger la première fois qu'il est nécessaire et
les stocker dans un tableau...

Cordialement

Gilles TOURREAU