GridViewPager中的Android Wear WearableListView

Jam*_*ieH 18 android android-fragments wear-os

我正在构建一个Android Wear应用程序,我希望将其作为几个可以横向滑动的页面呈现.

为此,我使用GridViewPager和相关联的FragmentGridPagerAdapter,它使用单行进行硬连线.这适用于在瓷砖之间水平滑动,但是在我的一个片段中,我想使用WearableListView来允许用户在多个动作之间进行选择.不幸的是,这不起作用,因为看起来GridViewPager阻止任何滑动到达WearableListView.有没有人知道是否有办法可以使用描述的组件完成?

我也尝试过使用标准的ViewPager,这样可以让WearableListView滚动得很好,但是水平滑动变得很好,你经常需要滑动几次才能移动视图寻呼机.

Mor*_*rne 31

编辑:
在下面发布我的原始答案一段时间后,我找到了正确的方法来做到这一点.刚设置

    wearableListView.setGreedyTouchMode( true )
Run Code Online (Sandbox Code Playgroud)

列表视图在GridViewPager中完美运行.

原始答案仍然是一个很好的视图,使滚动工作与垂直滚动GridViewPager嵌套在水平滚动一个.

原始答案:
通过像这样扩展GridViewPager,可以更简洁地实现与接受的答案大致相同的事情:

public class HorizontalListPager extends GridViewPager {

    private final GestureDetector mGestureDetector;

    public HorizontalListPager( Context context, AttributeSet attrs ) {
        super( context, attrs );
        mGestureDetector = new GestureDetector( context, new HScrollDetector() );
    }

    @Override
    public boolean onInterceptTouchEvent( MotionEvent ev ) {
        // If we have more horizontal than vertical scrolling, intercept the event,
        // otherwise let the child handle it
        return super.onInterceptTouchEvent( ev ) && mGestureDetector.onTouchEvent( ev );
    }

    class HScrollDetector extends GestureDetector.SimpleOnGestureListener {

        @Override
        public boolean onScroll( MotionEvent e1, MotionEvent e2, float distanceX, float distanceY ) {
            // Returns true if scrolling horizontally
            return ( Math.abs( distanceX ) > Math.abs( distanceY ) );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 一定要喜欢这个没有文档的东西!让我像克里斯托弗哥伦布一样填补 (6认同)

Gra*_*ung 10

我碰到了同样的事情.只设置一行或覆盖canscrollvertically()不起作用.我发现的唯一选择是覆盖触摸事件,如Neevek的答案: ScrollView Touch Handling中的Horizo​​ntalScrollView

这对我有用:

private float xDistance, yDistance, lastX, lastY;

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            setDownPosition(ev);
            break;
        case MotionEvent.ACTION_MOVE:
            if (isVerticalScroll(ev))
                return false;
    }

    return super.onInterceptTouchEvent(ev);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            setDownPosition(ev);
            break;
        case MotionEvent.ACTION_MOVE:
            if (isVerticalScroll(ev))
                return false;
    }

    return super.onTouchEvent(ev);
}

private void setDownPosition(MotionEvent ev){
    xDistance = yDistance = 0f;
    lastX = ev.getX();
    lastY = ev.getY();
}

private boolean isVerticalScroll(MotionEvent ev){
    final float curX = ev.getX();
    final float curY = ev.getY();
    xDistance += Math.abs(curX - lastX);
    yDistance += Math.abs(curY - lastY);
    lastX = curX;
    lastY = curY;
    if(xDistance < yDistance) {
        return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)