Found a solution by overriding the onInterceptTouchEvent() of
ListView, here it goes:
...
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
//Call super first because it does some hidden motion event
handling
boolean result = super.onInterceptTouchEvent(ev);
//Now see if we are scrolling vertically with the custom gesture
detector
if (gestureDetector.onTouchEvent(ev)) {
return result;
}
//If not scrolling vertically (more y than x), don't hijack the
event.
else {
return false;
}
}
// 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) {
try {
if (Math.abs(distanceY) > Math.abs(distanceX)) {
return true;
} else {
return false;
}
} catch (Exception e) {
// nothing
}
return false;
}
}
...
As for the recycling: yes, it sucks, there's actually none right now
on the vertical axis this way, so the scrolling is a bit clunky, since
I'm constructing new ViewPagers. But I have to implement this
behavior, so at least it does work.
On Oct 27, 1:21 am, Dianne Hackborn <[email protected]> wrote:
> How exactly do you recycle the list view items correctly? This is...
> crazy.
>
>
>
>
>
>
>
>
>
> On Wed, Oct 26, 2011 at 2:25 AM, Zsombor <[email protected]> wrote:
> > I have a ViewPager widget in every row of a ListView. This provides a
> > shelf-like UI, so the user can scroll around searching for a shelf
> > vertically, and then scroll horizontally amongst the contents of a
> > shelf. This works.
>
> > But the scrolling experience is terrible: if I start to drag a shelf's
> > ViewPager, scroll it horizontally, and accidentally drag a bit upwards/
> > downwards, then the ListView "traps" this dragging action, and start
> > to scroll vertically, ending my horizontal drag. In this state, the
> > drag action won't "return" to the ViewPager, the ListView has it, and
> > that's it. I have to start another drag action to affect the ViewPager
> > again. So I guess the ListView has precedence in these cases.
>
> > How can this be fixed? I'd like to achieve the exact opposite: If the
> > ViewPager inside a list row starts reacting to a horizontal drag, then
> > it should trap that action, and this drag should stop affecting the
> > ListView, no matter how the user moves his/her finger vertically. Can
> > this be done?
>
> > --
> > You received this message because you are subscribed to the Google
> > Groups "Android Developers" group.
> > To post to this group, send email to [email protected]
> > To unsubscribe from this group, send email to
> > [email protected]
> > For more options, visit this group at
> >http://groups.google.com/group/android-developers?hl=en
>
> --
> Dianne Hackborn
> Android framework engineer
> [email protected]
>
> Note: please don't send private questions to me, as I don't have time to
> provide private support, and so won't reply to such e-mails. All such
> questions should be posted on public forums, where I and others can see and
> answer them.
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en