Android Wear WearableListView在GridViewPager中

我正在构build一个Android Wear应用程序,我想将其作为可以横向滑动的几页来展示。

为此,我正在使用一个GridViewPager和相关联的FragmentGridPagerAdapter,它被硬连线使用一行。 这对于在磁贴之间水平滑动的工作正常,但是在我的片段之一中,我想使用WearableListView来允许用户在几个动作之间进行select。 不幸的是,这不起作用,因为它看起来GridViewPager是防止任何滑动到WearableListView。 有谁知道是否有一种方法可以使用所描述的组件来完成?

我也尝试使用标准的ViewPager,这使得WearableListView能够正常滚动,但是水平滑动然后变成flakey,并且您经常需要滑动几次来移动视图寻呼机。

Related of "Android Wear WearableListView在GridViewPager中"

我遇到了同样的事情。 只是设置一行或重写canscrollvertically()不起作用。 我发现唯一的select是重写触摸事件,如在Neevek的答案在这里: ScrollView触摸处理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; } 

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

  wearableListView.setGreedyTouchMode( true ) 

和列表视图完美的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 ) ); } } } 

非常感谢Graydyn Young ..因为我花时间去了解如何实现他的解决scheme,就是我所做的:

  • 创build一个类(FragmentViewPager),用以前的代码扩展GridViewPager。
  • 使用这个类而不是GridViewPager

     import android.content.Context; import android.support.wearable.view.GridViewPager; import android.util.AttributeSet; import android.view.MotionEvent; public class FragmentViewPager extends GridViewPager { public FragmentViewPager(Context context, AttributeSet attrs) { super(context, attrs); } public FragmentViewPager(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public FragmentViewPager(Context context) { super(context); } 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; } } 

在你的活动布局中:

 <com.example.FragmentViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" /> 

在你的活动onCreate()中:

 final FragmentViewPager pager = (FragmentViewPager) findViewById(R.id.pager);