首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在NestedScrollView中拦截向下抛出的RecyclerView

NestedScrollView 是一个可以实现嵌套滚动的控件,它可以包裹其他滚动控件,并且支持嵌套滚动的效果。在 NestedScrollView 中拦截向下抛出的 RecyclerView 是为了实现一种特殊的滑动效果,即当 RecyclerView 向下滚动到顶部后,继续往下滑动时,NestedScrollView 接管滚动事件,而不是将滚动事件传递给父容器处理。

拦截向下抛出的 RecyclerView 可以通过自定义 NestedScrollView 的子类来实现。在该子类中,重写 onInterceptTouchEvent() 方法,并在方法中判断当前滚动方向是否为向下滚动,如果是,则拦截该触摸事件,阻止其向下传递给 RecyclerView。

以下是一个示例代码:

代码语言:txt
复制
public class CustomNestedScrollView extends NestedScrollView {

    private float startY;
    private RecyclerView recyclerView;

    public CustomNestedScrollView(Context context) {
        super(context);
    }

    public CustomNestedScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomNestedScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                startY = ev.getY();
                recyclerView = findRecyclerView(this);
                break;
            case MotionEvent.ACTION_MOVE:
                float currentY = ev.getY();
                if (currentY > startY && recyclerView != null && !recyclerView.canScrollVertically(-1)) {
                    // 向下滑动,RecyclerView 已经滑动到顶部,拦截事件
                    return true;
                }
                break;
        }
        return super.onInterceptTouchEvent(ev);
    }

    private RecyclerView findRecyclerView(ViewGroup viewGroup) {
        int childCount = viewGroup.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = viewGroup.getChildAt(i);
            if (child instanceof RecyclerView) {
                return (RecyclerView) child;
            } else if (child instanceof ViewGroup) {
                RecyclerView recyclerView = findRecyclerView((ViewGroup) child);
                if (recyclerView != null) {
                    return recyclerView;
                }
            }
        }
        return null;
    }
}

在上述示例代码中,我们创建了一个 CustomNestedScrollView 类,继承自 NestedScrollView,重写了 onInterceptTouchEvent() 方法。在 onInterceptTouchEvent() 方法中,我们记录下当前触摸事件的起始Y坐标,然后判断当前滚动方向是否为向下滑动,并且判断 RecyclerView 是否已经滑动到顶部(通过 recyclerView.canScrollVertically(-1) 方法判断)。如果是向下滑动且 RecyclerView 已经滑动到顶部,就返回 true,拦截该触摸事件,否则返回 super.onInterceptTouchEvent(ev)。

通过将上述 CustomNestedScrollView 作为布局文件中的 NestedScrollView 使用,即可实现在 NestedScrollView 中拦截向下抛出的 RecyclerView 的效果。例如:

代码语言:txt
复制
<com.example.CustomNestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- 这里放置其他内容 -->

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</com.example.CustomNestedScrollView>

对于腾讯云相关产品,我推荐使用腾讯云的云服务器(CVM)来搭建后端服务,使用云数据库 MySQL 来存储数据,使用云函数(SCF)来处理业务逻辑,使用对象存储(COS)来存储多媒体文件。这些产品可以很好地支持云计算和开发需求,并具有高可用性、弹性扩展等优势。

具体腾讯云产品介绍和使用说明,可以参考以下链接:

注意:上述链接只是示例,具体的产品选择需要根据实际需求和情况进行评估和选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

嵌套滑动通用解决方案--NestedScrollingParent2

京东首页 可见,向上滑动页面时,当tabLayout滑动到顶部时,外层RecyclerView停止滑动,此时tabLayout即为吸顶状态,接着会 滑动ViewPager内层RecyclerView...那么是否可以tabLayout吸顶时,外层不要拦截事件,从而内层RecyclerView获取事件进而滑动呢?...2.2 再来看看NestedScrollView嵌套RecyclerView 关于NestedScrollView嵌套RecyclerView情况,即头部和列表可以一起滑动。如下图: ?...NestedScrollView嵌套RecyclerView 参考这篇实名反对《阿里巴巴Android开发手册》NestedScrollView嵌套RecyclerView用法。...相当于一个事假序列分发了两次,避免了常规事件分发 父view拦截后子view无法处理问题。 onNestedPreScroll具体处理,请看代码,有详细注释。

3.7K31

Android开发笔记(一百三十五)应用栏布局AppBarLayout

那么Android5.0也同时给出了相应解决方案,即推出MaterialDesign库,通过该库AppBarLayout控件,对Toolbar加以包装,从而实现顶部工具栏动态变化效果。...,还要通知头部控件(通常是Toolbar),告诉头部控件你要怎么滚,是爱咋咋滚,还是满大街滚; 具体到实现上,要在工程做以下修改: 1、添加几个库支持,包括appcompat-v7库(Toolbar...RecyclerView是其中一个特工,它可用来替代ListView和GridView;替代ScrollView则另有其人,它便是嵌套滚动视图NestedScrollViewAndroid5.0之后...所以,搜遍AndroidSDK源码,总共也只有三个控件符合这个条件,它们是RecyclerViewNestedScrollView,以及SwipeRefreshLayout,布局文件中使用名称如下所示...: RecyclerView : 使用名称android.support.v7.widget.RecyclerView NestedScrollView : 使用名称android.support.v4

2K40
  • 再也不用担心面试官问RecycleView了

    然后新出现position=7数据通过postionmCacheViews找不到对应ViewHolder,通过itemtype也mRecyclerPool找不到对应数据,所以会调用onCreateViewHolder...因为Recyclerviewv25版本引入了一个新机制,预取机制。...缓存其实就是缓存itemview,Recyclerview中就是viewholder。 cachedView就是mCacheViews缓存区view,是不需要重新绑定数据。...之前说过解决滑动冲突办法有两种:「内部拦截法和外部拦截法」。这里我提供一种内部拦截法,还有一些其他办法大家可以自己思考下。...也就是说当它嵌套在NestedScrollView时,默认会随着NestedScrollView滚动而滚动,放弃了自己滚动。所以给我们感觉就是滞留、卡顿。

    1.5K20

    聊聊Android嵌套滑动

    嵌套滑动控件场景,可以Android事件分发机制本身做一些处理,外部拦截或者内部消化触摸事件。...view(例如 NestedScrollViewRecyclerView ) ,开始嵌套滑动都依赖NestedScrollingChildHelper 这个对象。...RecyclerView 为例: 嵌套滑动我们最先接触到可能就是 NestedScrollView 这个控件了,那么它是怎么支持嵌套滑动呢?...接下来看下,如果拦截下来了, NestedScrollView 是如何处理触摸事件: DOWN 时候直接触发嵌套滑动: MOVE 时候 mIsBegingDragged false但是距离还没到时候...不全是,最常见比如 NestedScrollView 包裹 RecyclerView ,这时候 NestedScrollView 会把 UNSPECIFIED 传递给 RecyclerView onMeasure

    1.3K10

    EditTextRecyclerView解决方案

    有时候,一个列表Item会有EditText出现,而由于View复用机制,如果不好好处理EditText,将会出现一些问题。...菜是原罪 EditTextRecyclerView问题 例子是这样,每个Item包含一个title、一张图片以及一个评分,这个评分就是通过输入框来输入。...先看下效果如下: 这里,每张图片输入图片title对应分数,可以看到,由于未绑定数据和RecyclerView复用机制存在,一些图片中还没输入分数,就已经出现分数了。...首先我是试了一个,removeTextWatcher方法,那就是AdapterdetachViewHolderFromWindow方法移除TextWatcher,如下: class PicAdapter...很简单,updateView(),也就是bind过程每次去更新PicItem就可以了。

    2.7K20

    Java8Consumer抛出异常

    最近在实现公司内部一个通用svn数据工具类,其中有段代码是拿到当前更新后数据进行下一步操作,用是java8Consumer实现,代码如下: public void save(final DTO...Exception 这段代码一开始并没有什么问题,但是投入生产后发现有些异常数据导致服务器报错了,但是前台还是返回操作成功,debug查看后发现是异常被调用方吃掉了,原因了原生Consumer不支持异常抛出...,只能内部处理,接到反馈后,自己测试确实能复现,查看Consumer源码发现原生确实不支持抛出,查阅网络资料,发现只能重写一个Consumer方法,特此记录一下 @FunctionalInterface...异常抛出 * @author:Erwin.Zhang * @date: 2021-03-01 10:59:19 */ @FunctionalInterface public interface...import javax.validation.constraints.NotNull; * @ClassName: Throwing * @Description: Java8Consumer抛出异常

    3.9K20

    NestedScrollView 嵌套 ListView 实现滑动折叠效果

    当我们引入RecyclerView时候,恰好是压死骆驼最后一根稻草,故不得不采用其他方案来代替RecyclerView 和 CollapsingToolbarLayout实现折叠效果。...本文试着采用 NestedScrollView 嵌套 ListView方法来实现折叠效果。具体结果如图所示: ?...enterAlways - 实现quick return效果, 当向下移动时,立即显示View(比如Toolbar). exitUntilCollapsed - 向上滚动时收缩View,但可以固定Toolbar...题外话:直接使用RecyclerView折叠动画不平滑问题 stackoverflow上找到如下解决方案,大致是由于google官方留Behavior坑。...题外话3 23.2.0CoordinatorLayout中使用Toolbar ,toolbar无法与顶部对齐,即顶部存在垂直间距。

    3.4K50

    NestedScrollView+Recyclerview下滑卡顿解决方法

    大家进行安卓开发用到NestedScrollView+Recyclerview时候,经常出现情况就是加载下滑时候没有任何问题,很流畅,但是在下滑以后明显出现了卡顿情况,小编根绝这个问题,给大家再来解决方法...,头部可能是一些比较复杂多种界面,可能采用比较简单方法来处理,那就是NestedScrollView+Recyclerview,这这种方式比较直观和方便操作.比如像下面的代码 <?...布局文件添加 android:nestedScrollingEnabled="false" 这一属性 或者通过代码设置也是可以, mRecycler.setNestedScrollingEnabled...加载数据时候获取到了焦点导致,所 以只需要在对RecylerView设置不能获取焦点即可....会出现item显示不全等一些问题,现在google提供NestedScrollView已经可以解决该问题,但是使用NestedScrollView嵌套RecyclerView时候会发现我们RecyclerView

    2.7K20

    Android解决RecyclerViewitem显示不全方案

    需要使用ScrollView嵌套RecyclerView,当RecyclerViewitem数量比较多时,就会出现item只显示一部分数据,并没有将用户勾选商品数量全部显示出来,这个时候就需要我们做一下处理了...下面来说两种解决方案: 1、使用5.0新控件NestedScrollView替换ScrollView....NestedScrollView支持嵌套滑动,既能填item显示不全坑,又可以填嵌套滑动卡顿坑。不了解童鞋可以去学习一波,这里就不做详细说明了。...用法: (1)、布局文件中将ScrollView替换成"android.support.v4.widget.NestedScrollView"....2、RecyclerView外面嵌套一层RelativeLayout,然后添加属性 android:descendantFocusability="blocksDescendants".

    2.8K30

    ViewPager2实现内部Item动态滚动

    当然RecyclerView也可以,用一个仿抖音那种 LayoutManager 就行,但是为什么不呢,因为涉及到了视频播放,手动去处理一些生命周期和懒加载,总是非常麻烦,而且ViewPager2本身就是基于...但是首先你要考虑东西就很多,如果视频详情页超出一屏呢,也就是内部用了 RecyclerView或者NestedScrollView 呢,是不是还需要处理一下滑动冲突,当然这也不是很困难,内部拦截法就可以搞定...ViewPager2.fakeDragBy(x) 内部最终是调用了RecyclerView scrollBy() ,也就是相对滑动,哦原来如此,难怪调了一下,滑了这么远。...解决方法 既然如此,ViewPager2是基于RecyclerView,那么我去调用RecyclerView滚动不就行吗,思路如下: ViewPager2-> RecyclerView, RecyclerView...需要注意点 就如我上面最开始分析时所述,如果详情页是可滑动,那么就必须处理一下滑动冲突,相应方式也很简单,使用内部拦截法,让滑动View优先获得事件即可,当处于滑动View顶部时,再将事件还给父

    1.6K20

    拦截Android网络运用技巧

    本文中,我们将深入研究OkHttp拦截器,了解其工作原理以及如何使用它们来优化您Android应用程序。...什么是OkHttp拦截器 OkHttp拦截器是一种机制,允许您在网络请求和响应传输过程执行自定义操作。它们通常用于记录请求日志、修改请求头、缓存响应或进行身份验证等操作。...拦截器链执行是RealCall类完成,它遍历拦截器列表并按照添加顺序依次执行。...proceed()方法,它依次调用拦截intercept()方法,将请求传递给下一个拦截器,并最终返回响应。...通过创建自定义拦截器,您可以在请求和响应传输过程执行各种操作,以优化您应用程序。无论是日志记录、身份验证、缓存还是其他操作,拦截器都可以帮助您更好地控制和定制网络请求流程。

    45820

    Android解决RecyclerViewitem显示不全方案

    需要使用ScrollView嵌套RecyclerView,当RecyclerViewitem数量比较多时,就会出现item只显示一部分数据,并没有将用户勾选商品数量全部显示出来,这个时候就需要我们做一下处理了...下面来说两种解决方案: 1、使用5.0新控件NestedScrollView替换ScrollView....NestedScrollView支持嵌套滑动,既能填item显示不全坑,又可以填嵌套滑动卡顿坑。不了解童鞋可以去学习一波,这里就不做详细说明了。...用法: (1)、布局文件中将ScrollView替换成"android.support.v4.widget.NestedScrollView"....2、RecyclerView外面嵌套一层RelativeLayout,然后添加属性 android:descendantFocusability="blocksDescendants".

    7.6K40
    领券