您可能在开发过程中遇到过这种情况,在 Activity/Fragment 被重新创建后,RecyclerView 丢失了它之前保有的滚动位置信息。...通常这种情况发生的原因是由于异步加载 Adapter 数据,且数据在 RecyclerView 需要进行布局的时候尚未加载完成,导致 RecyclerView 无法恢复到之前的滚动位置。...从 1.2.0-alpha02 版本开始,Jetpack RecyclerView 提供了一个新的 API,可以让 Adapter 在数据加载完成之前阻塞布局行为 ,从而避免丢失滚动位置信息。...接下来我们会介绍如何使用这个新的 API,以及它的工作原理。 恢复至原有滚动位置 有好几种方法可以用来恢复 RecyclerView 至正确的滚动位置,您可能已经在实际项目中用到了这些方法。...赶快开始使用吧!
数据,不需要重新bindView。...缓存的其实就是缓存item的view,在Recyclerview中就是viewholder。 cachedView就是mCacheViews缓存区中的view,是不需要重新绑定数据的。...还有一个办法就是用Nestedscrollview代替ScrollView,Nestedscrollview是官方为了解决滑动冲突问题而设计的新的View。...这是因为RecyclerView默认是setNestedScrollingEnabled(true),这个方法的含义是支持嵌套滚动的。...也就是说当它嵌套在NestedScrollView中时,默认会随着NestedScrollView滚动而滚动,放弃了自己的滚动。所以给我们的感觉就是滞留、卡顿。
更强大的滚动控件RecyclerView 新建FruitAdapter02: package com.example.listviewtest; import android.support.v7.widget.RecyclerView...android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView...recyclerView = (RecyclerView) findViewById(R.id.recycler_view); LinearLayoutManager layoutManager...= new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); FruitAdapter02...adapter = new FruitAdapter02(fruitList); recyclerView.setAdapter(adapter); } private
下面是AppBarLayout结合RecyclerView实现的工具栏向上滚动效果截图: ?...NestedScrollView 虽说通过AppBarLayout可实现Toolbar的滚动效果,但并非所有可滚动的控件都会触发Toolbar滚动,事实上只有Android5.0之后新增的少数滚动控件才具备该特技...RecyclerView是其中一个特工,它可用来替代ListView和GridView;替代ScrollView的则另有其人,它便是嵌套滚动视图NestedScrollView,在Android5.0之后的...下面是AppBarLayout结合NestedScrollView实现的工具栏向上滚动效果截图: ?...所以,搜遍Android的SDK源码,总共也只有三个控件符合这个条件,它们是RecyclerView、NestedScrollView,以及SwipeRefreshLayout,在布局文件中使用的名称如下所示
当我们引入RecyclerView的时候,恰好是压死骆驼的最后一根稻草,故不得不采用其他方案来代替RecyclerView 和 CollapsingToolbarLayout实现的折叠效果。...本文试着采用 NestedScrollView 嵌套 ListView的方法来实现折叠效果。具体结果如图所示: ?...app:layout_scrollFlags="scroll|exitUntilCollapsed" 表示CoordinatorLayout的依赖元素滚动的时候,进行折叠。...enterAlwaysCollapsed - 当你的View已经设置minHeight属性又使用此标志时,你的View只能以最小高度进入,只有当滚动视图到达顶部时才扩大到完整高度。...嵌套的listView滚动时无响应bug。
ScrollView和RecyclerView滑动冲突问题方法1:我们可以把scrollview换成androidx.core.widget.NestedScrollViewRecyclerView滚动冲突 --> NestedScrollView android:layout_width...="match_parent" android:layout_height="match_parent"> recyclerview.widget.RecyclerView...的外部套一个RelativeLayoutGridView在NestedScrollView失去高度显示不全在使用Android的ScrollView里面嵌套GridView时,设置android:layout_height...-- 原生Gridview自带滚动条,继承此类重写方法去掉滚动 --><com.example.view.MyGridView android:id="@+id/menu_view" android
enterAlwaysCollapsed:假设你定义了一个最小高度(minHeight)同时enterAlways也定义了,那么view将在到达这个最小高度的时候开始显示,并且从这个时候开始慢慢展开,当滚动到顶部的时候展开完...应该说在MD中,RecyclerView代替了ListView,而NestedScrollView代替了ScrollView,他们两个都可以用来跟ToolBar交互,实现上拉下滑中ToolBar的变化。...在RecyclerView或者任意支持嵌套滚动的view比如NestedScrollView上添加app:layout_behavior。...RecyclerView的任意滚动事件都将触发AppBarLayout或者AppBarLayout里面view的改变。...假设你定义了一个最小高度(minHeight)同时enterAlways也定义了,那么view将在到达这个最小高度的时候开始显示,并且从这个时候开始慢慢展开,当滚动到顶部的时候展开完。
(例如 NestedScrollView 、 RecyclerView ) 中,开始嵌套滑动都依赖NestedScrollingChildHelper 这个对象。...RecyclerView 为例: 嵌套滑动我们最先接触到的可能就是 NestedScrollView 这个控件了,那么它是怎么支持嵌套滑动的呢?...我们仍然从它的touch事件处理流程开始看: 在它的 onInterceptTouchEvent 中,当手势是 MOVE 的时候, 如果是垂直方向滑动并且达到滑动定义的距离,就开始执行滑动: 当手势是...如果滑动的时候不拦截的话,手势事件会交给子view去处理,如果子view是可以滚动的,这时候就会有冲突,所有滚动的时候事件要拦截下来交给自己处理。...不全是,最常见的比如 NestedScrollView 包裹 RecyclerView ,这时候 NestedScrollView 会把 UNSPECIFIED 传递给 RecyclerView 的 onMeasure
嗨,我是哈利迪~最近有个bug排查了好几天,就是有个老页面因业务复杂度,使用了NestedScrollView+tab+多Fragment的结构(各Fragment里有RecyclerView,即存在嵌套滑动...: 添加了嵌套滚动改进;请参阅 NestedScrollingChild3 和 NestedScrollingParent3。...代码仅供演示,非必要情况下并不推荐NestedScrollView和RecyclerView的嵌套。...相比NestedScrollView,RecyclerView只实现了NestedScrollingChild2,在嵌套滑动体系里只能作为子布局存在,所以下面以RecyclerView为子,NestedScrollView...前面分析过的,他是在RecyclerView里被调的,当然没受影响。
嗨,我是哈利迪~最近有个bug排查了好几天,就是有个老页面因业务复杂度,使用了NestedScrollView+tab+多Fragment的结构(各Fragment里有RecyclerView,即存在嵌套滑动...: 添加了嵌套滚动改进;请参阅 NestedScrollingChild3 和 NestedScrollingParent3。...[007S8ZIlly1ghf2ej40ryj306406aabd.jpg] 代码仅供演示,非必要情况下并不推荐NestedScrollView和RecyclerView的嵌套。...相比NestedScrollView,RecyclerView只实现了NestedScrollingChild2,在嵌套滑动体系里只能作为子布局存在,所以下面以RecyclerView为子,NestedScrollView...前面分析过的,他是在RecyclerView里被调的,当然没受影响。
最初想用 CoordinatorLayout 加 RecyclerView,但效果不好直接用,或者用 NestedScrollView 与 RecyclerView 组合使用。...但 NestedScrollView 与 RecyclerView 组合时怎么也不能使 RecyclerView 自己滑动,而 NestedScrollView 不滑动,事件拦截,禁止嵌套滑动,NestedScrollView...-- 一开始显示的复杂 View --> <TextView android:id="@+id/bigTitle"...,让外面滚动,此时 appbarLayout.y 从 0 开始慢慢变小, // 变到 -barHeightDistance 时不再滑动,让 RecyclerView 滑动...1,悬浮标题还能看见 } else { // 要吸顶的位置到了,让外面滚动,此时 appbarLayout.y 从 0 开始慢慢变小, // 变到 -barHeightDistance
,不需要重新createViewHolder; 2) 不需要重新bindView了。...,但是第二个feed之 后的滚动是流畅的,因为这个时候RecyclerView已经有能重用的view了。...具体实现方式是:在 RecyclerView 开始一个滚动时new Runnable对象,根据 layout manager 和滚动的方向预取即将进入视野的条目,可以同时取出一个或多个条目,例如在使用...(false);//RecyclerView默认是setNestedScrollingEnabled(true),是支持嵌套滚动的,也就是说当它嵌套在NestedScrollView中时,默认会随着NestedScrollView...滚动而滚动,放弃了自己的滚动。
通常我们要自行手动处理的就是RecyclerView作为嵌套滑动子view的情况。NestedScrollView一般直接作为根布局用来解决嵌套滑动。...2.2 再来看看NestedScrollView嵌套RecyclerView 关于NestedScrollView嵌套RecyclerView的情况,即头部和列表可以一起滑动。如下图: ?...NestedScrollView嵌套RecyclerView 参考这篇实名反对《阿里巴巴Android开发手册》中NestedScrollView嵌套RecyclerView的用法。...从此篇文章分析结论得知,NestedScrollView嵌套RecyclerView虽然可以实现效果,但是RecyclerView会瞬间加载所有item,RecyclerView失去的view回收的特性...,大于想要滚动的距离,内层自行处理 }else { //内层已滚动的距离,小于想要滚动的距离,那么内层消费一部分,到顶后,剩的外层滑动
在 RecyclerView 或其他类似 NestedScrollView 这样的可以嵌套滚动的 View 中加入 app:layout_behavior。...RecyclerView 上的任何滚动事件都将触发 AppBarLayout 或任何包含在其中的 view 的布局发生变化。...通过指定 minHeight 和 exitUntilCollapsed,剩余内容开始滚动之前将首先达到 Toolbar 的最小高度,然后退出屏幕: ?...你将需要像这个示例中展示的那样用 NestedScrollView 来代替。...将你的内容包含在 NestedScrollView 中,然后在其上添加 app:layout_behavior 就会使你的滚动行为预期工作。
记录 RecyclerView 滚动位置并恢复是一个很常见的需求,通常需要精准恢复到上次的位置。...预计会用到 RecyclerView 相关的三个知识点: 监听 RecyclerView 滚动状态 监听 RecyclerView 完成绘制 滚动 RecyclerView 到指定的位置 思路: 在「RecyclerView...); boolean hasStarted = newState == RecyclerView.SCROLL_STATE_DRAGGING; //此时,RecyclerView 滚动开始...这里使用 LinearLayoutManager.scrollToPositionWithOffset(int position, int offset) ,它可以精准的定位到上次的位置,也不需要展示滚动动画...How to scrollto an offset inside recyclerview?
但是首先你要考虑的东西就很多,如果视频详情页超出一屏呢,也就是内部用了 RecyclerView或者NestedScrollView 呢,是不是还需要处理一下滑动冲突,当然这也不是很困难,内部拦截法就可以搞定...解决方法 既然如此,ViewPager2是基于RecyclerView,那么我去调用RecyclerView滚动不就行吗,思路如下: ViewPager2-> RecyclerView, RecyclerView...默认是私有的,可以通过反射或者 getChildAt(0) 获取 RecyclerView不支持 scrollTo() ,可以通过 LinearLayouManager 去滚动 LinearLayoutManager-scrollToPositionWithOffset...() 支持滚动到偏移位置 伪代码如下: val layoutManager = (getChildAt(0) as?...需要注意的点 就如我上面最开始分析时所述,如果详情页是可滑动的,那么就必须处理一下滑动冲突,相应的方式也很简单,使用内部拦截法,让滑动的View优先获得事件即可,当处于滑动View顶部时,再将事件还给父
需要使用ScrollView嵌套RecyclerView,当RecyclerView中的item数量比较多时,就会出现item只显示一部分数据,并没有将用户勾选的商品数量全部显示出来,这个时候就需要我们做一下处理了...下面来说两种解决方案: 1、使用5.0的新控件NestedScrollView替换ScrollView....NestedScrollView支持嵌套滑动,既能填item显示不全的坑,又可以填嵌套滑动卡顿的坑。不了解的童鞋可以去学习一波,这里就不做详细的说明了。...2、在RecyclerView的外面嵌套一层RelativeLayout,然后添加属性 android:descendantFocusability="blocksDescendants"....它一共有3个属性值,它们分别是: beforeDescendants:viewGroup会优先子类控件而获取焦点; afterDescendants:viewGroup只有当子类控件不需要获取焦点的时候才去获取焦点
Add an app:layout_behavior to a RecyclerView or any other View capable of nested scrolling such as NestedScrollView...在RecyclerView或者任意支持嵌套滚动的view比如NestedScrollView上添加app:layout_behavior。...RecyclerView的任意滚动事件都将触发AppBarLayout或者AppBarLayout里面view的改变。...AppBarLayout里面定义的view只要设置了app:layout_scrollFlags属性,就可以在RecyclerView滚动事件发生的时候被触发: .support.design.widget.AppBarLayout...假设你定义了一个最小高度(minHeight)同时enterAlways也定义了,那么view将在到达这个最小高度的时候开始显示,并且从这个时候开始慢慢展开,当滚动到顶部的时候展开完。 ?
滚动事件,那么在CoordinatorLayout布局里其它标记了app:layout_behavior的子View(LinearLayout、RecyclerView、NestedScrollView...等)就能够响应(如ToolBar、TabLayout)控件被标记的滚动事件。...– (Tab的宽度平均分配),也实现了可滚动的选项卡 – (Tab宽度不固定,同时可以横向滚动),还实现了所有Tab居中显示。...布局下包裹一个可以滑动的布局,比如 RecyclerView,NestedScrollView(经过测试,ListView,ScrollView不支持)具有滑动效果的组件。...给你的可滑动的组件,也就是RecyclerView 或者 NestedScrollView 设置如下属性: app:layout_behavior="@string/appbar_scrolling_view_behavior
SwipeRefreshLayout Android 5.0 抽屉布局 DrawerLayout Android 5.0 滑动面板布局 SlidingPaneLayout Android 5.0 嵌套滚动视图...NestedScrollView Android 5.0 appcompat-v7 工具栏 Toolbar Android 5.0 recyclerview-v7 循环视图 RecyclerView...v4库默认会被编译进App的安装包,所以它不需要系统内核支持,可直接运行在4.0之后的所有系统上,并且App工程无需手工导入v4库。...这部分控件数量最多,实现的界面特效最丰富,而且互相之间存在依赖关系,如design库依赖于appcompat-v7库,部分design控件如NavigationView还依赖于recyclerview-v7...Android5.0和6.0之后补充了这么多新控件,自然有部分老控件变过时了,下面就列举部分新旧控件的替代关系: Toolbar:替代ActionBar RecyclerView:替代ListView和
领取专属 10元无门槛券
手把手带您无忧上云