2013-06-11 9 views
11

Mam więc moją działalność, która ma główną ViewPager, a wewnątrz ViewPagera każda strona ma całą zawartość jako ScrollView, a wewnątrz ScrollView jest inna ViewPager.Android ViewPager z ScrollViews z ViewPagers wewnątrz ScrollViews

To może zabrzmieć szaleńczo, ale w zasadzie zewnętrzna ViewPager zawiera artykuły z wiadomościami, a artykuły są długie, więc istnieje ScrollView, a wewnątrz ScrollView znajduje się wiele miniaturek/obrazków, które mogą przesuwać.

Próbowałem kilku różnych niestandardowych widoków z różnymi przechwytywaniami zdarzeń dotykowych, ale nie można tego uznać za doskonałe. Albo całkowicie wchłonie wszystkie zdarzenia dotykowe, aby pionowe przewijanie ScrollView nie działało w tym obszarze, albo będzie bardzo drażliwe/trudne do uzyskania wewnętrznego przewijania w poziomie.

Ktoś ma idealne rozwiązanie?

+0

Czy rozwiązać swój problem? Próbuję zrobić to, czego dokładnie próbowałeś. – tasomaniac

+0

Tak, moje rozwiązanie znajduje się poniżej. Daj mi znać jeśli potrzebujesz pomocy! – egfconnor

+0

Próbowałem tego rozwiązania, ale daje mi problemy z klikalnymi elementami w układzie przewijania. Gdy przewijam w pionie element klikalny, widok przewijania nie jest przewijany. – tasomaniac

Odpowiedz

12

W przypadku gdy ktoś chce wiedzieć, moje rozwiązanie:

public class CustomScrollView extends ScrollView { 
private GestureDetector mGestureDetector; 
View.OnTouchListener mGestureListener; 

public CustomScrollView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    mGestureDetector = new GestureDetector(context, new YScrollDetector()); 
    setFadingEdgeLength(0); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    return super.onInterceptTouchEvent(ev) 
      && mGestureDetector.onTouchEvent(ev); 
} 

// Return false if we're scrolling in the x direction 
class YScrollDetector extends SimpleOnGestureListener { 
    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, 
      float distanceX, float distanceY) { 
     if (Math.abs(distanceY) > Math.abs(distanceX)) { 
      return true; 
     } 
     return false; 
    } 
} 
} 

i zewnętrzna jest najbardziej ViewPager:

public class NestingViewPager extends ViewPager { 

public NestingViewPager(final Context context, final AttributeSet attrs) { 
    super(context, attrs); 
} 

public NestingViewPager(final Context context) { 
    super(context); 
} 

@Override 
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { 
    if (v != this && v instanceof ViewPager) { 
     return true; 
    } 
    return super.canScroll(v, checkV, dx, x, y); 
} 
} 
+2

Ten kod uratował mi życie! Dzięki :) –

+0

Cieszę się, że ci pomogło! – egfconnor

+0

Hej, mam problem z widokiem przewijania i przeglądam pager w nim, ale przewijanie w pionie nie działa nawet przy przewijaniu tekstu w programie custon ?? – Tony