2017-10-17 3 views
0

J'ai une activité dans Android avec un scrollView. Le scrollView affiche une disposition fixe avec plusieurs éléments (texte, plus de mises en page, iamges, etc.). Lorsque l'activité est chargée, j'affiche la mise en page et commence à télécharger une image - lorsque l'image est téléchargée, je l'affiche dans le scrollView en l'ajoutant dans un RelativeLayout qui se trouve au début/en haut de la mise en page principale.Comment empêcher la mise à jour de scrollView

La mise en page Relative a sa hauteur définie sur WRAP_CONTENT, donc avant que l'image soit affichée, sa hauteur est zéro; Lorsque l'image est ajoutée, elle est redimensionnée à la hauteur de l'image. Le problème est que si l'utilisateur défile avant que l'image soit chargée et que le RelativeLayout de l'image soit hors de l'écran, le Y haut de la scrollView change et le contenu descend (cela détourne la personne qui regarde le contenu). Pour corriger cela, j'obtiens la hauteur de l'image qui est téléchargée, vérifiez si l'image est hors de l'écran et si oui, j'ajuste le haut de scrollView en appelant scrollView.scrollBy(0, imageHeight); Cela corrige le problème mais il casse un court 'scintillement 'de l'écran entre les deux actions, par exemple, ajouter l'image à la mise en page (contenu en descendant) et ajuster le haut de scrollView (contenu revenant à la position d'origine). Voici le code qui « fixe » la position de scrollview:

public void imageLoaded(final ImageView img) { 
     img.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     final int imgHeight = img.getMeasuredHeight(); 

     // image is loaded inside a relative layout - get the top 
     final RelativeLayout parent = (RelativeLayout) img.getParent(); 
     final int layoutTop = parent.getTop(); 

     // adjust the layout height to show the image 
     // 1. this changes the scrollview position and causes a first 'flickering' 
     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, imgHeight); 
     parent.setLayoutParams(params); 

     // adjust scrollbar so that the current content position does not change 
     // 2. this corrects the scrollview position but causes a second 'flickering' 
     // scrollY holds the scrollView y position (set in the scrollview listener) 
     if (layoutTop < scrollY) 
      scrollview.post(new Runnable() { 
       public void run() { 
        scrollview.scrollBy(0, imgHeight); 
       } 
      }); 

     img.setVisibility(View.VISIBLE); 
    } 

Ce que je dois corriger cela est un moyen de désactiver les mises à jour d'écran ou des mises à jour ScrollView avant que le processus de chargement/de réglage et activer après.

Quelqu'un sait-il comment faire?

+2

les programmeurs sont mieux à lire les codes sources. ; p – user1506104

+0

Ajout d'un code montrant le processus d'ajustement – user501223

Répondre

0

Il s'avère que le problème était dû au fait que l'appel à scrollView.scrollBy a été appelé à partir d'un thread. Enlever cela a résolu le problème. Voici le code correct:

public void imageLoaded(final ImageView img) { 
     img.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     final int imgHeight = img.getMeasuredHeight(); 

     // image is loaded inside a relative layout - get the top 
     final RelativeLayout parent = (RelativeLayout) img.getParent(); 
     final int layoutTop = parent.getTop(); 

     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, imgHeight); 
     parent.setLayoutParams(params); 

     if (layoutTop < scrollY) 
      scrollview.scrollBy(0, imgHeight); 

     img.setVisibility(View.VISIBLE); 
    }