您可能在开发过程中遇到过这种情况,在 Activity/Fragment 被重新创建后,RecyclerView 丢失了它之前保有的滚动位置信息。...通常这种情况发生的原因是由于异步加载 Adapter 数据,且数据在 RecyclerView 需要进行布局的时候尚未加载完成,导致 RecyclerView 无法恢复到之前的滚动位置。...从 1.2.0-alpha02 版本开始,Jetpack RecyclerView 提供了一个新的 API,可以让 Adapter 在数据加载完成之前阻塞布局行为 ,从而避免丢失滚动位置信息。...接下来我们会介绍如何使用这个新的 API,以及它的工作原理。 恢复至原有滚动位置 有好几种方法可以用来恢复 RecyclerView 至正确的滚动位置,您可能已经在实际项目中用到了这些方法。...如果根据您的项目实际情况无法采用这种方法,那也可以使用其他的方法,只是要么比较复杂 (比如避免在 RecyclerView 中设置 Adapter,但这样又有可能导致像 header 等 item 的显示问题
引言 最近,在做公司一个design折叠效果的时候遇到个问题,就是我们本身app的方法数太多了,dex分包技术还没搞定。不得不尽量缩减一些不必要的包、类。...当我们引入RecyclerView的时候,恰好是压死骆驼的最后一根稻草,故不得不采用其他方案来代替RecyclerView 和 CollapsingToolbarLayout实现的折叠效果。...true,不过这里兼容性还是存在问题的,特别是android 4.4版本的折叠布局的透明statusbar,不知道改为有没更好的方式。...,其他CollapsingToolbarLayout内的子view做相应的改变如(视差)或pin(不变)。...题外话:直接使用RecyclerView折叠动画不平滑问题 在stackoverflow上找到如下解决方案,大致是由于google官方留的Behavior坑。
更强大的滚动控件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
本博文专门讲解和CoordinatorLayout相关的知识点,这也是Design Support Library中最重要与最难的部分。...---- Code Samples 官方为我们提供了一个漂亮的demo ,使用了 CoordinatorLayout 和其他的 design support library特性. ?...在RecyclerView或者任意支持嵌套滚动的view比如NestedScrollView上添加app:layout_behavior。...RecyclerView的任意滚动事件都将触发AppBarLayout或者AppBarLayout里面view的改变。...AppBarLayout里面定义的view只要设置了app:layout_scrollFlags属性,就可以在RecyclerView滚动事件发生的时候被触发: .support.design.widget.AppBarLayout
,出现了许多的控件,这些控件都和CoordinatorLayout配合出各种效果,接下来我们就先简单介绍一下这些控件。...AppBarLayout的子布局有5种滚动标识(上面代码CollapsingToolbarLayout中配置的app:layout_scrollFlags属性): scroll:所有想滚动出屏幕的view...在RecyclerView或者任意支持嵌套滚动的view比如NestedScrollView上添加app:layout_behavior。...RecyclerView的任意滚动事件都将触发AppBarLayout或者AppBarLayout里面view的改变。...AppBarLayout里面定义的view只要设置了app:layout_scrollFlags属性,就可以在RecyclerView滚动事件发生的时候被触发: <android.support.design.widget.AppBarLayout
然后,我们需要在 AppBarLayout 和 期望被滚动的 View 之间定义一个关联。...在 RecyclerView 或其他类似 NestedScrollView 这样的可以嵌套滚动的 View 中加入 app:layout_behavior。...RecyclerView 上的任何滚动事件都将触发 AppBarLayout 或任何包含在其中的 view 的布局发生变化。...第三方滚动和视差效果库 除了使用上述的 CoordinatorLayout,还可以查看这些流行的第三方库来实现 ScrollView, ListView, ViewPager 和RecyclerView...间的滚动和视差效果。
不过,Android在实现展开效果的时候,并非直接让Toolbar展开或收缩,而是另外提供了CollapsingToolbarLayout,通过该布局包裹Toolbar,从而控制标题栏的展开和收缩行为。...声明工具栏的滚动行为标志; 其实真正运行的时候,Toolbar的高度是固定不变的,变化高度的是CollapsingToolbarLayout。...只是许多App把这两者的背景设为一样的,所以看起来像是统一的标题栏在收缩和展开。...同时声明scroll和exitUntilCollapsed,滚动效果如下图所示: ?...同时声明scroll和snap,滚动效果如下图所示: ?
下面是AppBarLayout结合RecyclerView实现的工具栏向上滚动效果截图: ?...RecyclerView是其中一个特工,它可用来替代ListView和GridView;替代ScrollView的则另有其人,它便是嵌套滚动视图NestedScrollView,在Android5.0之后的...和NestedScrollView,还有哪些控件可以触发AppBarLayout的滚动行为呢?...1、AppBarLayout的滚动依赖于主体视图的滚动,与主体视图相对应的,可将AppBarLayout称作头部视图。既然一个页面分为头部和主体两部分,那么就存在谁先滚谁后滚的问题了。...同时声明scroll和enterAlways,滚动效果如下图所示: ? 后面三个标志都与CollapsingToolbarLayout有关,得配合该控件才能观察细节差异。
通常AppBarLayout和CollapsingToolbarLayout是一起使用的,也就是CoordinatorLayout、AppBarLayout、CollapsingToolbarLayout...、Toolbar常常是组合应用的,AppBarLayout能够赋予Toolbar显示和消失的功能,而CollapsingToolbarLayout能够赋予Toolbar伸缩的功能 AppBarLayout...CollapsingToolbarLayout的使用方法也比较固定,AppBarLayout包裹CollapsingToolbarLayout,由于需要伸缩Toolbar,所以它使用的app:layout_scrollFlags...,可是设定app:layout_collapseMode属性,其中parallax表示随着滑动控件的滚动,最终该控件会消失,pin则表示,最终不会消失,废话不多说,来看下xml <?...,否则没有效果 另外需要注意的是,Toolbar的title属性并不会起作用,我们需要在代码中调用CollapsingToolbarLayout的setTitle方法才能设置标题 private CollapsingToolbarLayout
了解 CollapsingToolbarLayout主要是提供一个可折叠的Toolbar容器,对容器中的不同View设置layout_collapseMode折叠模式,来达到不同的折叠效果。...其实就是向下滚动时Scrolling View和Child View之间的滚动优先级问题。...对比scroll和scroll | enterAlways设置,发生向下滚动事件时,前者优先滚动Scrolling View,后者优先滚动Child View,当优先滚动的一方已经全部滚进屏幕之后,另一方才开始滚动...这里涉及到Child View的高度和最小高度,向下滚动时,Child View先向下滚动最小高度值,然后Scrolling View开始滚动,到达边界时,Child View再向下滚动,直至显示完全。...在内容滚动时,CollapsingToolbarLayout中的View(比如ImageView)也可以同时滚动,实现视差滚动效果,通常和layout_collapseParallaxMultiplier
SwipeRefreshLayout是官方提供的下拉刷新控件,在使用过程碰到一些小问题和大家分享下....下面的代码只能监听下拉手势所引发的事件 mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener...,但不会触发上面的监听 //这段代码如果写在onCreate方法中是无效的,因为SwipeRefreshLayout控件还未完全加载,可以使用延迟加载的方法使用下面的代码 mSwipeRefreshLayout.setRefreshing...也不会有下拉刷新的视图 RecyclerView有一点想要分享的是,如果你没有把它和Adapter关联,他会跳过加载,不会实际去初始化这个控件,虽然在布局代码写着 这个和我上面提到SwipeRefreshLayout...提到那个问题放在一起使用,就会产生你下拉不会触发事件的问题.
"就是这句和CoordinatorLayout控件互动实现滑动,总结就是CoordinatorLayout控件和app:layout_behavior来进行互动,进而CoordinatorLayout的子控件和...2.AppBarLayout 其次就是AppBarLayout,去除官方解释,简单来说就是它可以让你定制当某个可滚动View的滚动手势发生变化时,其内部的子View实现何种动作。...enterAlways:值设为enterAlways的View,当ScrollView往下滚动时,该View会直接往下滚动。而不用考虑ScrollView是否在滚动。...这是layout_srcollFlags里可以设置的各个属性的解释,考虑文章的重点是模仿支付宝所以没有篇幅和每个属性都给个效果图,所以各属性你们有空还要自己试一试,这样子才能掌握更好。...3.CollapsingToolbarLayout 是用来对Toolbar进行再次包装的ViewGroup,主要是用于实现折叠的App Bar效果。
其中, scroll表示CollapsingToolbarLayout会随着水果内容详情的滚动一起滚动, exitUntilCollapsed表示当CollapsingToolbarLayout随着滚动完成折叠之后就保留在界面上...这里在CollapsingToolbarLayout中定义了一个ImageView和一个Toolbar,也即这个高级版的标题栏是由普通的标题栏加上图片组合而成的。...由于CoordinatorLayout本身已经可以响应滚动事件了, 因此我们在它的内部就需要使用NestedScrollView或RecyclerView这样可以响应滚动事件的布局。...另外,通过 app:layout_behavior属性指定一个布局行为,这和之前 第四弹 在RecyclerView中的用法是一模一样的。...然后在FruitAcuvityTheme中将状态栏的颜色指定成透明色, 由于values-v21目录是只有Android5.0及以上的系统才会去读取的, 因此这么声明是没有问题的。
,这个View会 跟着 滚动 事件响应, layout_scrollFlags=“enterAlways”的时候 这个View会响应下拉事件 所以呈现出来的结果应该是我们在上拉的时候toolBar...=scroll的时候,这个View会 跟着 滚动 事件响应, layout_scrollFlags=“snap”的时候 在Scroll滑动事件结束以前 ,如果这个View部分可见,那么这个View会停在最接近当前...的变化 CollapsingToolbarLayout里面 包含ImageView 和ToolBar,ImageView的app:layout_collapseMode=”parallax”,表示视差效果...对于AppBarLayout,我们主要 讲解了这个属性app:layout_scrollFlags,设置不同 的属性我们可以在滚动的时候显示不同 的效果 对于CollapsingToolbarLayout...,我们主要讲解了app:layout_collapseMode这个属性,设置不同的值,我们可以让其子View呈现不同的 炫酷效果,如parallax和pin等 CoordinatorLayout的相关用法还有很多
CoordinatorLayout、AppBarLayout 和 TabLayout 是 Android Material Design 中实现高级交互和动效的核心组件。...协同工作流程 滚动事件传递: 用户滑动 RecyclerView/ViewPager。...事件分发: RecyclerView(作为 NestedScrollingChild)将滚动事件传递给它的父布局 CoordinatorLayout(作为 NestedScrollingParent)。...避免嵌套滚动冲突: 使用 NestedScrollView 时注意性能。 RecyclerView 推荐使用。 4....和 collapseMode,可以实现丰富的视觉动效,提升用户体验。
AppBarLayout下方与之并列的滑动控件有比如RecyclerView,NestedScrollView(与AppBarLayout同属于CoordinatorLayout的子View),这些并列的...,一套全新的事件处理方式,它可以指定“作用View”和“被依赖View”,要改变行为的那个View就是child,dependency是作为触发器影响child的那个View。...作用View随着被依赖View状态的变化而变化,有点类似于观察模式中的观察者和被观察者。...:是一个专门用来包裹Toolbar的控件,里面可以放置一个头部ImageView和一个toolbar。...内部的子View一般都要加上属性:app:layout_collapseMode="",常用值是parallax(视差滚动),pin(固定)。
在 GitHub 开源了一种新的 Header View + RecyclerView 实现方式,使用 CoordinatorLayout 把 header 抽离出 RecyclerView,并做到上下滑联动...说明: 可以使用 SmoothAppBarLayout 这个第三方库,它是一个提供顺滑滚动的 AppBarLayout 补足库,这一个层次必须置于 RecyclerView 代码下面,也就是界面上是在...RecyclerView 的上层,这样AppBarLayout 包裹的 header views 才能接收到点击事件(其实根本原因是,RV 对于 Padding 部分也会拦截手势所以不得不这么做)。...如果想要列表上滑的时候,状态栏跟随着滑动显示出阴影效果,可以在 FrameLayout 外再包裹一层 android.support.design.widget.CollapsingToolbarLayout...由于受制于微信公众平台内容字数的限制,无法展现源码,源码和具体内容,欢迎大家访问drakeet的博客。
功能都顺利实现,美中不足的是当前Item闪了一下,QA甚至为此提了Bug,一开始以为是图片加载库的问题,之后随着图片加载库从ImageLoader换成Picaso,又换成Glide,这个Bug一直如影随形...notifyItemRemoved(int position) 更新指定位置Item public final void notifyItemChanged(int position) 但是现在的问题就是...与同行们交流了下,也有人遇到同样的问题,解决办法居然是调用notifyDataSetChanged()方法来刷新数据,这样就不会有闪一下的动画了。...但是这样不就失去使用RecyclerView的优势和意义了吗? 最后我是通过重写RecyclerView的动画来解决这一“Bug”。...(0)和alpha(1),然后保存。
其实这个问题没有什么难度了,下面的两种方式都可以实现,但是效果可能并不是我想要的。...recyclerView.scrollToPosition(position); recyclerView.smoothScrollToPosition(position); 因为我的效果是想要指定的position...(0, top); } else { recyclerView.scrollToPosition(p); //先让当前view滚动到列表内 move = true; } recyclerView.addOnScrollListener...()) { recyclerView.scrollBy(0, recyclerView.getChildAt(n).getTop()); //滚动到顶部 }...比如,如果子视图实际位于RecyclerView的左侧,SNAP_TO_ANY和SNAP_TO_START是没有 差别的。 默认值就是SNAP_TO_ANY啦。
在我们开始之前,有必要在这里澄清一下:在 CoordinatorLayout 中使用 CollapsingToolbarLayout 来实现折叠工具栏是没任何问题的。...举个例子,一个折叠工具栏应该根据用户的滚动进行展开和折叠,所以实际动画的运行应该时刻跟随用户的拖拽进行。这也是那些框架办不到的地方。 废话不多说,让我们看下我们所要尝试模拟做到的行为动作。...这里的代码展示了一个折叠工具栏,应用了 Material Components Library 库里的 CollapsingToolbarLayout 和 CoordinatorLayout 布局。...元素 OnSwipe 把过渡动画和用户在 RecyclerView 上的拖拽操作绑定到了一起,也就是之前我们查看到的主布局中的列表。...别小看这里短短的 10 行 XML 代码,它背后可为我们做了大量的工作哦。这其中内部原理非常复杂,它由 RecyclerView 的滚动行为所驱动。