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