1

Récemment, j'ai commencé à travailler sur le défilement personnalisé pour RecyclerView mais j'ai rencontré un problème. J'ai fait parallaxe en-tête et cela a bien fonctionné, mais ensuite je voulais faire des lignes se développer lorsque vous faites défiler. Pour cette méthode, j'ai besoin d'utiliser recyclerView.computeVerticalScrollOffset() cela fonctionne très bien pour les deux premiers éléments de la liste, mais il s'effondre.RecyclerView décalage tombe lors du changement de la hauteur de la ligne dans Android

Voici un exemple de mon code:

FrameLayout main = (FrameLayout) holder.itemView; 
if (main != null) { 
    int height = calculateHeight(offset, (position + i)); 
    RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) main.getLayoutParams(); 
    lp.height = height; 
    main.setLayoutParams(lp); 
} 

J'ai donc une fonction qui calcule la hauteur en fonction de la position dans la mise en page et le décalage du recyclerview. Lorsque le deuxième élément atteint Y == 0, le décalage diminue de moitié (il passe de 1200 à 600, puis il continue mais les calculs sont tous faux)

Des idées sur la façon d'obtenir une valeur de décalage stable ou comment la changer avec quelque chose qui est compatible avec la position recyclerView.

EDIT:

OK, je peux décrire l'étape de problème par étape:

  • élément à la position (0) de l'adaptateur a une hauteur de 1200
  • Tous les autres éléments ont la hauteur par défaut de 300
  • Lorsque l'utilisateur commence à défiler vers le bas, l'élément à la position (1) commence à augmenter de 300 à 1200 hauteur

--------- Ceci est l'endroit où le code commence à se fissurer ... -----------

  • Lorsque l'élément à la position (1) avec le nouvelle hauteur de 1200 atteint le haut de l'écran (lorsque getTop() == 0) offset ici est d'environ 900.
  • Lorsque ce même élément commence à sortir de l'écran (l'utilisateur fait défiler vers le bas) le décalage au point où l'écran supérieur et cet élément collision (0,0) se décompose de la moitié, donc décalage est maintenant 450 quand il devrait être 900, puis il va de 450 sur, mais mon élément à la position (1) est maintenant seulement la moitié de la taille qu'il devrait être ..
+0

Pouvez-vous donner un exemple précis de ce que les calculs sont erronés? Lorsque le décalage diminue de moitié, est-ce un comportement inattendu? – LarsH

+1

J'ai édité et essayé d'expliquer le problème avec des mots, étape par étape, j'espère que ça aide – slorangex

Répondre

2

OK J'ai créé une solution de contournement pour cette solution et je l'affiche comme réponse, si quelqu'un en a besoin à l'avenir.

Calculez votre propre décalage:

public int offsetForVerticalScrolling(RecyclerView recyclerView) { 
    LinearLayoutManager llm = (LinearLayoutManager) recyclerView.getLayoutManager(); 

    int position = llm.findFirstVisibleItemPosition(); 
    ViewHolder mViewHolder = (ViewHolder) recyclerView.findViewHolderForAdapterPosition(position); 
    View item = mViewHolder.itemView; 

    int y = (int) item.getY(); 
    if (y < 0) y *= -1; 

    if (position == 0) return y; 
    else { 
     int offset = y; 
     for (int i = 0; i < position; i++) { 
      //Add your previous item heights to offset 
     } 
     return offset; 
    } 
}