6

Um das Problem zu replizieren, klonte ich ein existing project und fügte zwei Fragmente hinzu. So, jetzt gibt es eine Activity mit einer ViewPager, die 2 Fragmente haben. Jede hat eine RecyclerView (vertikal), die mehrere Elemente RecyclerView (horizontal) enthält.Autoscroll isuue, wenn horizontales RecyclerView als Element in einem vertikalen RecyclerView platziert wird

Nun Problem ist die Autoscroll vertikaler RecyclerView auf Register-Schalt wenn mittleren Punkt horizontal RecyclerView oben verlassen wurde.

Zum Beispiel:

  1. Seite 1 wird auf diese Position gescrollt

(Beachten Sie, dass die erste H-Recycler Darstellung als nur zur Hälfte sichtbar eingestellt ist)

  1. Tippen Sie dann auf PAGE 2 auf tablayout, um zur Seite 2 zu gelangen.

  2. Tippen Sie nun erneut auf PAGE 1 auf tablayout, um zur Seite 1 zurückzukehren. Hier ist die erwartete Scroll-Position, wo wir früher waren, aber automatisch scrollt in die oberste Position. wie diese

(Erste RecyclerView ist voll sichtbar statt Hälfte.)


ich einige Hinweise bekommen, während Lösung herauszufinden.

  • Dieses Problem tritt bei Bibliotheken von v24.1.1 und v24.2.1 auf (zu dem Zeitpunkt des Schreibens), aber wenn es auf v23.4.0 herabgestuft wird, funktioniert es wie erwartet. Es ist also klar, dass in der Bibliothek etwas verändert wurde, was zu diesem Verhalten geführt hat.
  • Das gleiche Problem mit einem Artikel, der webview enthält, ist aufgetreten. Eine Gemeinsamkeit zwischen WebView und H-RecyclerView ist, dass beide horizontal scrollbar sind. Das Problem kann mit dem Verbrauch des Scroll-Ereignisses zusammenhängen.
  • +0

    rufen Sie etwas auf pageVisible Ereignis oder etwas? – Jai

    +0

    Nein ... Es wird nichts aufgerufen, wenn der sichtbare Hinweis des Benutzers geändert wird. – HBB20

    Antwort

    0

    Sie können den Scroll-Status speichern, wenn die Fragment der ViewPager umschaltet. Lets haben eine static Variable in Ihrem Activity, die den Scroll-Zustand wie dieser

    public static int scrollPositionIndex; 
    public static int scrollPositionOffset; 
    

    nun von Ihrem Fragment, überschreiben die setUserVisibleHint Funktion speichert.

    @Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
        super.setUserVisibleHint(isVisibleToUser); 
        // Make sure that we are currently visible 
        if (this.isVisible()) { 
         // If we are becoming invisible, then... 
         if (!isVisibleToUser) { 
    
          // Save scroll state 
          LinearLayoutManager layoutManager = ((LinearLayoutManager) mRecyclerView.getLayoutManager()); 
          YourActivity.scrollPositionIndex = layoutManager.findFirstVisibleItemPosition(); 
    
          View v = mRecyclerView.getChildAt(0); 
          YourActivity.scrollPositionOffset = (v == null) ? 0 : (v.getTop() - mRecyclerView.getPaddingTop()); 
    
         } else { 
          // Scroll to the saved position 
          mLayoutManager.scrollToPositionWithOffset(YourActivity.scrollPositionIndex, 
            YourActivity.scrollPositionOffset); 
    
          // Reset the value 
          YourActivity.scrollPositionIndex = 0; 
          YourActivity.scrollPositionOffset = 0; 
         } 
        } 
    } 
    
    +0

    Danke für die Antwort. Ich habe versucht, Ihre Lösung, aber immer noch das gleiche ... Es scrollt automatisch .. – HBB20

    +0

    Was ist das Problem, das Sie hier begegnen? 'setUserVisibleHint' wird aufgerufen oder nicht? Kann die gescrollte Position speichern? –

    +0

    setUserVisibleHint wird aufgerufen, aber dann scrollt es nach oben .... – HBB20

    Verwandte Themen