5

Mam podgląd stron iw jednym z fragmentów mam dwa osobne fragmenty zawierające odpowiednio pionowy i poziomy widok recyklingu.Wyłącz stronicowanie ViewPager, gdy widok recyklingu podrzędnego przewija do ostatniego elementu.

Kiedy przewijam poziomy widok recyklingu do ostatniego elementu i spróbuję przesunąć dalej, widok będzie przewijany do następnej strony. Nie chcę tego. Chcę wyłączyć stronicowanie strony podglądu, gdy próbuję przewyższyć poziomy widok recyklingu.

Nie chcę jednak wyłączać stronicowania strony podglądu, gdy przesuję palcem w inne miejsce. Na przykład, jeśli mam zamiar przesunąć pionowy widok recyklingu lub dowolne puste miejsce w segmencie nadrzędnym, to powinien on spowodować zmianę stron podglądu.

Czytam in this SO question, jak wyłączyć stronicowanie strony głównej. Również this SO question jest podobny pod tym względem, że istnieje przeglądarka podrzędna, jednak nie udało mi się powtórzyć tego z poziomym widokiem recyklingu.

Oto niektóre struktury:

Zwyczaj viewpager który pozwala mi wyłączyć stronicowania (wziął go od pierwszego SO odwołuje powyżej):

public class CustomViewPager extends ViewPager { 

private boolean enabled; 

public CustomViewPager(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    this.enabled = true; 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if (this.enabled) { 
     return super.onTouchEvent(event); 
    } 

    return false; 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    if (this.enabled) { 
     return super.onInterceptTouchEvent(event); 
    } 

    return false; 
} 

public void setPagingEnabled(boolean enabled) { 
    this.enabled = enabled; 
} } 

Dla recyclerview poziomej I ustawić ontouchlistener (podobny do sekundy SO odwołuje powyżej):

horizontalRecyclerView.setOnTouchListener(new View.OnTouchListener() { 
       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        switch(event.getAction()){ 
         case MotionEvent.ACTION_MOVE: 
          customViewPager.setPagingEnabled(false); 
          break; 
         case MotionEvent.ACTION_UP: 
          customViewPager.setPagingEnabled(true); 
          break; 
        } 
        return false; 
       } 
      }); 

Dodatkowe obserwacje: zauważyłem, że czasami jeśli długo naciśnij poziomy widok recyklingu, zanim go przeciągnę, nie przejdzie do następnej strony w oknie podglądu. Jeśli jednak szybko przeciągnę, przeglądarka wyświetli następną stronę.

Czy ktoś wie, jak to zrobić?

Każda pomoc jest doceniana.

+0

znalezione rozwiązanie. Szukam tego samego –

Odpowiedz

12

Oto rozwiązanie.

requestDisallowInterceptTouchEvent() 

Ta metoda nie pozwala na przeniesienie rodzica. Zatrzymuje zdarzenie dotykowe viewpager.

horizontalRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { 
     @Override 
     public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 
      int action = e.getAction(); 
      switch (action) { 
       case MotionEvent.ACTION_MOVE: 
        rv.getParent().requestDisallowInterceptTouchEvent(true); 
        break; 
      } 
      return false; 
     } 

     @Override 
     public void onTouchEvent(RecyclerView rv, MotionEvent e) { 

     } 

     @Override 
     public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

     } 
    }); 
+1

Super pomocne, dziękuję! – JasonWyatt

+0

ten działa dobrze, ale widok recyklingu jest przewijany do ostatniego elementu. powinien pokazać pierwszy element. –

+0

Musiałem użyć żądania ... na wszystkie zdarzenia, aby naprawdę zapobiec zachowaniu. public boolean onInterceptTouchEvent (RecyclerView rv, MotionEvent e) { rv.getParent(). RequestDisallowInterceptTouchEvent (true); return false; } –

1

Aby poradzić sobie z problem z pionowego przewijania nie działa Zrobiłem to zamiast:

Tworzenie dotykowy słuchacza dla elementu RecyclerView

mGestureDetector = new GestureDetector(itemView.getContext(), new GestureListener()); 

/** 
* Prevents the view pager from switching tabs when scrolling the carousel 
*/ 
private class TouchListener implements RecyclerView.OnItemTouchListener { 

    @Override 
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 
     mGestureDetector.onTouchEvent(e); 
     return false; 
    } 
} 

i wdrożenie GestureListener który wykluczy dotyk zdarzenia wykrywające poziome zwoje:

private class GestureListener extends SimpleOnGestureListener { 
    private final int Y_BUFFER = 10; 

    @Override 
    public boolean onDown(MotionEvent e) { 
     // Prevent ViewPager from intercepting touch events as soon as a DOWN is detected. 
     // If we don't do this the next MOVE event may trigger the ViewPager to switch 
     // tabs before this view can intercept the event. 
     mRecyclerView.requestDisallowInterceptTouchEvent(true); 
     return super.onDown(e); 
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
     if (Math.abs(distanceX) > Math.abs(distanceY)) { 
      // Detected a horizontal scroll, prevent the viewpager from switching tabs 
      mRecyclerView.requestDisallowInterceptTouchEvent(true); 
     } else if (Math.abs(distanceY) > Y_BUFFER) { 
      // Detected a vertical scroll of large enough magnitude so allow the the event 
      // to propagate to ancestor views to allow vertical scrolling. Without the buffer 
      // a tab swipe would be triggered while holding finger still while glow effect was 
      // visible. 
      mRecyclerView.requestDisallowInterceptTouchEvent(false); 
     } 
     return super.onScroll(e1, e2, distanceX, distanceY); 
    } 
} 
Powiązane problemy