Подтвердить что ты не робот

Android ViewPager с ScrollViews с ViewPagers внутри ScrollViews

Итак, у меня есть моя активность, у которой есть основной ViewPager и внутри ViewPager каждая страница имеет весь контент как ScrollView, а внутри этого ScrollView есть еще один ViewPager.

Это может показаться сумасшедшим, но в основном внешний ViewPager содержит статьи новостей, а статьи длинны, поэтому есть ScrollView, а внутри ScrollView есть несколько эскизов/изображений, которые они также могут пронести.

Я пробовал несколько разных пользовательских ViewPagers с различным перехватом событий прикосновения, но не может показаться, что это идеально. Он либо полностью поглотит все события касания, чтобы вертикальная прокрутка ScrollView не работала в этой области, или будет очень обидно/трудно заставить внутренний прокручивать по горизонтали.

У любого есть идеальное решение?

4b9b3361

Ответ 1

Если кто-то хочет знать мое решение:

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;
    }
}
}

и внешний вид 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);
}
}