Android es anidada conflicto ListView de diapositivas la solución perfecta ScrollView

Antes de escribir una forma de resolver el problema ScrollView anidado conflicto de diapositivas ScrollView, porque es el mismo problema y la naturaleza de esta causa conflicto de la diapositiva causadas por diferentes anidación, las soluciones también son los mismos, la única diferencia hacia atrás en el juicio sobre las condiciones específicas , por lo que este post en el código, y quieren ver la causa del problema la solución de las ideas puede ver este artículo - la solución perfecta para Android en ScrollView anidado conflicto de diapositivas ScrollView

public class MyScrollListView extends ListView {
    public MyScrollListView(Context context) {
        super(context);
    }

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

    public MyScrollListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public MyScrollListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    float preY = 0;

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                preY = ev.getY();
                getParent().requestDisallowInterceptTouchEvent(true);
                break;
            case MotionEvent.ACTION_MOVE:
                if (slideToTheTop(ev) || slideToTheBottom(ev))
                    getParent().requestDisallowInterceptTouchEvent(false);
                else
                    getParent().requestDisallowInterceptTouchEvent(true);
                break;
            case MotionEvent.ACTION_UP:
                getParent().requestDisallowInterceptTouchEvent(false);
                break;
        }
        return super.dispatchTouchEvent(ev);
    }

    /**
     * 当第一个可见item为0且手势为向下滑动且全部露出
     * @param ev
     * @return
     */
    private boolean slideToTheTop(MotionEvent ev) {
        return getFirstVisiblePosition() == 0 && getChildAt(0).getTop() == 0 && ev.getY() - preY > 0;
    }

    /**
     * 最后一个可见item为全部item最后一个且手势向上滑动且全部露出
     * @param ev
     * @return
     */
    private boolean slideToTheBottom(MotionEvent ev) {
        return getLastVisiblePosition() == getCount() - 1 && getChildAt(getChildCount() - 1).getBottom() == getHeight() && ev.getY() - preY < 0;
    }
}

 

Publicado 57 artículos originales · ganado elogios 26 · Vistas a 40000 +

Supongo que te gusta

Origin blog.csdn.net/Ever69/article/details/104343216
Recomendado
Clasificación