Android: comment obtenir le décalage X actuel de RecyclerView?

J'utilise une Scrollview pour un "Time-Picker Carousel" infini et j'ai découvert que ce n'est pas la meilleure approche ( dernière question )

Maintenant, j'ai trouvé la vue Recycler, mais je ne parviens pas à obtenir le décalage de défilement actuel dans la direction X du recyclerView ? (Disons que chaque élément a une largeur de 100px et que le deuxième élément est seulement visible à 50%, donc le défilement est de 150px)

  • Différentes bibliothèques / importations selon le type de construction
  • Comment dire à ProGuard de garder les champs privés sans spécifier chaque champ
  • Android & Maven: accélérez la compilation et le déploiement du projet
  • Pourquoi le paramètre de requête `sll` est-il ignoré pour une URL de Google Maps (sorte de)?
  • Comment ajouter par programme la vue dans ViewFlipper
  • Les résultats SharedPreferences.getInt () dans ClassCastException - Pourquoi?
    • Tous les éléments ont la même largeur, mais il existe un écart avant le premier, après le dernier élément
    • recyclerView.getScrollX() renvoie 0 (docs say: valeur de défilement initiale)
    • Le LayoutManager a findFirstVisibleItemPosition , mais je ne peux pas calculer le décalage X avec cela

    METTRE À JOUR

    Je viens de trouver un moyen de garder le suivi de la position X, tout en mettant à jour la valeur avec le rappel de onScrolled , mais je préférerais obtenir la valeur réelle au lieu de la suivre tout le temps!

     private int overallXScrol = 0; //... mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); overallXScroll = overallXScroll + dx; Log.i("check","overall->" + overallXScroll); } }); 

  • Pas une erreur de classe jointe Android Studio
  • Ajout de marqueurs multiples dans Google Maps API v2 Android
  • Après la rotation, onCreate () Fragment est appelé avant onCreate () FragmentActivity
  • Chargement de la vidéo Youtube via i-frame dans la visionneuse Android
  • Comment créer un fichier .apk à partir de la ligne de commande Windows?
  • Android: vérifier si les écouteurs sont branchés
  • 4 Solutions collect form web for “Android: comment obtenir le décalage X actuel de RecyclerView?”

    RecyclerView dispose déjà d'une méthode pour obtenir un décalage de défilement horizontal et vertical

     mRecyclerView.computeHorizontalScrollOffset() mRecyclerView.computeVerticalScrollOffset() 

    Cela fonctionnera pour RecyclerViews contenant des cellules de même hauteur (pour offset de défilement vertical) et la même largeur (pour décalage de défilement horizontal)

    Entrez la description de l'image ici

    Solution 1: setOnScrollListener

    Enregistrez votre position X en tant que variable de classe et mettez à jour chaque modification dans le système onScrollListener . Assurez-vous de ne pas réinitialiser overallXScroll (fe onScreenRotationChange )

      private int overallXScroll = 0; //... mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); overallXScroll = overallXScroll + dx; Log.i("check","overall X = " + overallXScroll); } }); 

    Solution 2: calculer la position actuelle.

    Dans mon cas, j'ai une liste horizontale remplie de valeurs de temps (0:00, 0:30, 1:00, 1:30 … 23:00, 23:30). Je calcule l'heure à partir de l'élément de temps, qui se trouve au milieu de l'écran (point de calcul). C'est pourquoi j'ai besoin de la position exacte X-Scroll de mon RecycleView

    • Chaque fois, l'élément a la même largeur de 60dp (fyi: 60dp = 30min, 2dp = 1min)
    • Le premier élément (élément d'en-tête) a un rembourrage supplémentaire, pour définir 0min au centre

       private int mScreenWidth = 0; private int mHeaderItemWidth = 0; private int mCellWidth = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //init recycle views //... LinearLayoutManager mLLM = (LinearLayoutManager) getLayoutManager(); DisplayMetrics displaymetrics = new DisplayMetrics(); this.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); this.mScreenWidth = displaymetrics.widthPixels; //calculate value on current device mCellWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 60, getResources() .getDisplayMetrics()); //get offset of list to the right (gap to the left of the screen from the left side of first item) final int mOffset = (this.mScreenWidth / 2) - (mCellWidth / 2); //HeaderItem width (blue rectangle in graphic) mHeaderItemWidth = mOffset + mCellWidth; mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); //get first visible item View firstVisibleItem = mLLM.findViewByPosition(mLLM.findFirstVisibleItemPosition()); int leftScrollXCalculated = 0; if (firstItemPosition == 0){ //if first item, get width of headerview (getLeft() < 0, that's why I Use Math.abs()) leftScrollXCalculated = Math.abs(firstVisibleItem.getLeft()); } else{ //X-Position = Gap to the right + Number of cells * width - cell offset of current first visible item //(mHeaderItemWidth includes already width of one cell, that's why I have to subtract it again) leftScrollXCalculated = (mHeaderItemWidth - mCellWidth) + firstItemPosition * mCellWidth + firstVisibleItem.getLeft(); } Log.i("asdf","calculated X to left = " + leftScrollXCalculated); } }); 

      }

    Merci à @ umar-qureshi pour le bon choix! Il semble que vous puissiez déterminer le pourcentage de défilement avec Offset , Extent et Range tels que

     percentage = 100 * offset / (range - extent) 

    Par exemple (à mettre dans un OnScrollListener ):

     int offset = recyclerView.computeVerticalScrollOffset(); int extent = recyclerView.computeVerticalScrollExtent(); int range = recyclerView.computeVerticalScrollRange(); int percentage = (int)(100.0 * offset / (float)(range - extent)); Log.i("RecyclerView, "scroll percentage: "+ percentage + "%"); 
     public class CustomRecyclerView extends RecyclerView { public CustomRecyclerView(Context context) { super(context); } public CustomRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomRecyclerView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public int getHorizontalOffset() { return super.computeHorizontalScrollOffset(); } } 

    Que vous devez obtenir le décalage:

     recyclerView.getHorizontalOffset() 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.