The problem is that the ListView (or rather its parent AbsListView ) implements onInterceptTouchEvent and therefore the ListView can intercept all touch events as soon as it considers that it is in the best position to handle them.
This can be avoided by calling requestDisallowInterceptTouchEvent , for example. by subclassing HorizontalScrollView and in its dispatchTouchEvent :
public boolean dispatchTouchEvent(MotionEvent ev) { boolean ret = super.dispatchTouchEvent(ev); if(ret) { requestDisallowInterceptTouchEvent(true); } return ret; }
It needs some refinement (for example, only calling requestDisallowInterceptTouchEvent if the horizontal component is larger than the vertical one), since now it almost never allows ListView to take control.
source share