【发布时间】:2017-07-27 05:30:22
【问题描述】:
我试图找出实现两个列表的最佳方法,其中父列表可以垂直滑动,子列表可以水平滑动。 假定父列表是一个无限列表,而子列表最多可以有 n 页。 RecyclerView 似乎是完成这项工作的最佳工具,并且由于添加了 PagerSnapHelper,重新创建页面滑动行为真的很容易(想想 ViewPager。) 我目前面临的问题是,当我们一直水平滑动到末尾或开头时,有时垂直的recyclerview(父级)会接管并更改页面。 即使使用单个垂直回收器视图也可以重新创建,如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
PagerSnapHelper snapHelper = new PagerSnapHelper();
SearchAdapter searchAdapter = new SearchAdapter();
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setAdapter(searchAdapter);
snapHelper.attachToRecyclerView(mRecyclerView);
}
从上到下或从下到上滑动/轻扫将按预期更改页面。但是,如果您进行水平运动(从左到右或从右到左),有时会出现垂直滑动。 PagerSnapHelper 似乎对快速移动非常敏感。当水平而不是垂直启动滑动时,有什么方法可以避免此页面更改?这个问题在我的案例中更为明显,因为我也有一个水平寻呼机。
可能的解决方案:
- 扩展 RecyclerView 控件 onTouchEvent 和 OnInterceptTouchEvent。还没想出使用这个的方法。
- 使用 GestureDetector
如果需要,我很乐意提供更多上下文/代码。 拥有两个 PagerSnapHelper 在 Android 中可能不是当前的模式,但即使我把那部分去掉,我也想知道为什么 PagerSnapHelper 对某些手势如此敏感。
【问题讨论】:
-
也许你应该覆盖onFling?
-
我也调查过。到触发 onFling 时,方向已经确定,velocityY 小于或大于 0,而 velocityX 始终为 0。我将在我的帖子中添加更多细节。
-
所以根据 abs(velocity) 你可以返回
super.onFling()或false? -
问题是当 onFling 被调用时它总是有垂直速度,这意味着到那时方向已经确定了。我会尝试做的是在 onFling 发生之前禁止触摸。
-
我现在采用这种方法。我将运动事件从
onInteceptTouchEvent()传递到自定义GestureDetector以获取有关 flings 的更多信息。我注意到,在进行从左到右的运动时,GestureDetector 显示速度velx: -4477.3296 --- velY: 256.26413和传递给 PagerSnapHelper 的 velY 端。我怎么能确定这不是一个有效的动议?
标签: android android-recyclerview