6

Aby odtworzyć problem, sklonowałem numer existing project i dodano dwa fragmenty. Teraz jest Activity z ViewPager, które mają 2 fragmenty. Każdy znak Fragment ma wartość RecyclerView (pionową), która zawiera wiele elementów o rozmiarze RecyclerView (poziomo).Automatyczne przewijanie ma miejsce, gdy pozioma pozycja RecyclerView jest umieszczana jako element pionowy. RecyclerView

Teraz problemem jest Autoscroll pionowej RecyclerView na kartę, gdy w połowie punkt przełączania poziome RecyclerView pozostawiono w górę.

Na przykład:

  1. stronie 1 jest przewijany w tej pozycji

(Należy zauważyć, że pierwszy widok H Recycler jest ustawiona tylko połowa jest widoczny)

  1. Następnie stuknij na STRONIE 2 na tablayout, aby przejść do strony 2.

  2. Teraz ponownie stuknij na STRONIE 1 na tablayout, aby powrócić na stronę 1. Tutaj spodziewana pozycja przewijania to miejsce, w którym wcześniej wyszliśmy, ale to automatyczne przewijanie do najwyższej pozycji. jak to

(pierwsza RecyclerView jest pełna widoczny zamiast połowę.)


mam pewne wskazówki podczas gdy na zastanawianie się rozwiązania.

  • Ten problem występuje w bibliotekach v24.1.1 i v24.2.1 (najnowsze w chwili pisania), ale po obniżeniu do wersji 23.4.0 działa zgodnie z oczekiwaniami. Jasne jest więc, że coś zostało zmodyfikowane w bibliotece, co doprowadziło do takiego zachowania.
  • Wystąpił ten sam problem z elementem zawierającym przeglądarkę internetową. Powszechną rzeczą między webView i H-recyclerView jest to, że oba są wewnętrznie przewijane w poziomie. Problem może być związany z konsumpcją zdarzenia przewijania.
+0

Czy dzwonisz do czegoś na stronieMożliwe wydarzenie czy coś? – Jai

+0

Nie ... Nic nie jest wywoływane, gdy widoczna wskazówka użytkownika została zmieniona. – HBB20

Odpowiedz

0

Możesz zapisać stan przewijania, gdy zmienia się Fragment z ViewPager. Pozwala mieć static zmienną w swoim Activity który będzie przechowywany stan przewijania jak ten

public static int scrollPositionIndex; 
public static int scrollPositionOffset; 

Teraz ze swojego Fragment, przesłonić funkcję setUserVisibleHint.

@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

Dzięki za odpowiedź. Próbowałem Twojego rozwiązania, ale wciąż zachowuję się tak samo ... To auto przewija się .. – HBB20

+0

W czym tkwi problem? "setUserVisibleHint" jest wywoływana czy nie? Czy można zapisać przewijaną pozycję? –

+0

setUserVisibleHint jest wywoływana, ale potem przewija do góry .... – HBB20