recycleview横向展开_修复垂直滑动RecyclerView嵌套水平滑动RecyclerView水平滑动不灵敏问题...

在Android应用中,垂直滚动的RecyclerView嵌套水平滚动的RecyclerView时,水平滑动可能不灵敏。问题源于系统事件分发机制,只判断距离而未考虑角度。通过修改RecyclerView的onInterceptTouchEvent方法,增加对拖动角度的判断,可以解决这个问题。示例代码提供了一个自定义的BetterRecyclerView,避免了滚动冲突。此外,当RecyclerView快速滑动到静止时,子RecyclerView不应响应滑动事件,可通过重写requestDisallowInterceptTouchEvent方法处理。
摘要由CSDN通过智能技术生成

在 Android 应用中,大部分情况下都会使用一个垂直滚动的 View 来显示内容(比如 ListView、RecyclerView 等)。但是有时候你还希望垂直滚动的View 里面的内容可以水平滚动。如果直接在垂直滚动的 View 里面使用水平滚动的 View,则滚动操作并不是很流畅。

比如下图中的示例:

为什么会出现这个问题呢?

上图中的布局为一个 RecyclerView 使用的是垂直滚动的 LinearLayoutManager 布局管理器,而里面每个 Item 为另外一个 RecyclerView 使用的是水平滚动的 LinearLayoutManager。而在 Android系统的事件分发 中,即使最上层的 View 只能垂直滚动,当用户水平拖动的时候,最上层的 View 依然会拦截点击事件。下面是 RecyclerView.java 中 onInterceptTouchEvent 的相关代码:

@Override

public boolean onInterceptTouchEvent(MotionEvent e) {

...

switch (action) {

case MotionEvent.ACTION_DOWN:

...

case MotionEvent.ACTION_MOVE: {

...

if (mScrollState != SCROLL_STATE_DRAGGING) {

boolean startScroll = false;

if (canScrollHorizontally && Math.abs(dx) > mTouchSlop) {

...

startScroll = true;

}

if (canScrollVertically && Math.abs(dy) > mTouchSlop) {

...

startScroll = true;

}

if (startScroll) {

setScrollState(SCROLL_STATE_DRAGGING);

}

}

} break;

...

}

return mScrollState == SCROLL_STATE_DRAGGING;

}

注意上面的 if 判断:

if(canScrollVertically && Math.abs(dy) >

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值