是当前的列表,xy为水平、垂直方向滑动坐标值,所以垂直方向,当y值>0时,说明列表正在向上滑动,<=0时列表向下滑动或停止。...,可知,结合这两个方法可判断出当前是下滑还是上滑动作,覆写方法,结合加入可视区域第一条和最后一条item的位置,可以判断出下拉、上拉的动作,因此完全可以自定义RecyclerView.OnScrollListener...) { //当前未滑动 int itemCount = manager.getItemCount(); //总数 int lastItemPosition...= manager.findLastCompletelyVisibleItemPosition();//最后显示的位置 if (lastItemPosition == (itemCount...} int fristItemPosition = manager.findFirstCompletelyVisibleItemPosition();//第一个显示的位置
mAttachedScrap:只保存重新布局时从RecyclerView分离的item的无效、未移除、未更新的holder。...和上面讲的传入payload原理一样,这两个是Android默认提供给我们使用的两个封装类。这里我以DiffUtil举例说明该如何使用。...3.为RecyclerView设置setHasStableIds为true,并同时重写RecyclerView.Adapter的getItemId方法来给每个Item一个唯一的ID,提高缓存的复用率。...对于可能来回滑动的RecyclerView,把CacheViews的缓存数量设置大一些,可以省去ViewHolder绑定的时间,加快布局显示。...当RecyclerView的元素比较高,一屏只能显示一个元素的时候,第一次滑动到第二个元素会卡顿,这个时候就需要预留的额外空间,让RecyclerView预加载可重用的缓存。
这个问题很容易出现,当我们的列表中有进度显示(比如下载),这时候需要不停的更新进度,就需要使用notifyItemChanged 使用notifyItemChanged可以只刷新那一个item,这样就避免了像...this.mItemAnimator.canReuseUpdatedViewHolder(viewHolder, viewHolder.getUnmodifiedPayloads()); } payloads应该对这个函数的返回值有影响...mAttachedScrap和mChangedScrap 这两个就涉及到RecyclerView的缓存机制了,整个缓存机制包含多个集合,这两个集合就是其中的重要部分,这个机制就不在这篇文章里细说了。...先看看它们俩个有什么用 mChangedScrap 与RecyclerView分离的ViewHolder列表 mAttachedScrap 未与RecyclerView分离的ViewHolder列表...holder, position); } else{ holder.tv.setText("change text"); } } 而且通过对payload设置不同的值,
10个 item,因此屏幕最多可显示 10+1 个 item,即 11 个item....这两个集合 当我们在屏幕上滑动的时候,移除的 ViewHolder 会首先放入mCachedViews,mCachedViews不满,ViewHolder 不会放入RecycledViewPool中 源码分析流程...RecyclerView.Recycler recycler = view.mRecycler; RecyclerView.ViewHolder holder; try...一次,因为onItemRangeChanged()方法的返回值决定是否执行刷新,为 true 的条件就是list 的 size==1, 因此不管在一次点击事件中notifyItemChanged()几次...= UpdateOp.UPDATE; // 这里只有 size=1 的时候 return,也就是说,若是开发者adapter.notifyItemChanged()方法 // 同时调用
同时也开源了生活博客,从12年起,积累共计N篇近100万字,陆续搬到网上,转载请注明出处,谢谢!...item的数据位置交换,再调用RecyclerView的notifyItemMoved()方法刷新布局,同时,因为RecyclerView自带item动画,就可以完成上面的交互效果。...那么优化处理其实可以放到这两个方法中处理。 左右滑动使item透明度变浅且缩小该如何实现呢?...11.RecyclerView上拉加载 添加recyclerView的滑动事件,上拉加载分页数据,设置上拉加载的底部footer布局,显示和隐藏footer布局 12.RecyclerView缓存原理...嵌套RecyclerView问题 要实现在NestedScrollView中嵌入一个或多个RecyclerView,会出现滑动冲突,焦点抢占,显示不全等。
同时RecyclerView的灵活性让它可胜任更多的场景。关于RecyclerView的使用有太多的文章了,大家可以自行搜索。...实现后的效果图如下: 首先,我们为WrapRecyclerView创建一个内部类WrapAdapterextendsAdapter ,同时重写WrapRecyclerView...注意:这里考虑到用户也需要自定义SpanSizeLookup,所以在设置前先获取一下,如果存在则在getSpanSize中返回正确的值保证显示效果。...firstPosition == 0 && firstTop >= 0; } else{ return true; } } 这两个方法会在滑动的时候被调用...逻辑比较简单,判断是否显示了第一个/最后一个item,并且它的top/bottom也显示了(说明这个item完整显示出来了)。
显示不了数据 RecyclerView 需要重新设置一下LayoutManger才可以显示: // 计算RecyclerView的大小,可以显示器内容 mRecyclerView.setLayoutManager...七、 Error install apk **方法一: 关闭Instant Run;方法一未解决,详见方法二 。...abiFilters 'armeabi', 'armeabi-v7a', 'x86'//, 'arm64-v8a', 'x86_64', 'mips', 'mips64' } } } 若方法二未解决...十三、 A TaskDescription's primary color should be opaque Android的colorPrimary不允许带有alpha值。...,然后调用scrollToPosition来实现,但是今天在同一个方法里调用scrollToPosition,发现上一行执行了,下面的行却未执行?
,这两个操作也确实方便很多。...lastPosition = positions[positions.length - 1]; } return lastPosition; } 这两个方法用于辅助判断滑动时是否到顶或到底...firstPosition == 0 && firstTop >= 0; } else{ return true; } } 这两个方法会在滑动的时候被调用...逻辑比较简单,判断是否显示了第一个/最后一个item,并且它的top/bottom也显示了(说明这个item完整显示出来了)。...实现效果如下 如果想改变显示或风格,可以通过pulltorefresh库的api来实现,关于pulltorefresh库的使用大家可以自行查阅相关文档。
3.未提升用户体验,视频播放器初始化完成前上面会覆盖有该视频的第一帧图片,但是发现存在第一帧图片与视频第一帧信息不符的情况,后面会通过代码给出解决方案。...2.2 使用RecyclerView 使用RecyclerView实现树枝方向上下切换视频分析 1.首先RecyclerView它设置竖直方向滑动是十分简单的,同时关于item的四级缓存也做好了处理,而且滑动的效果相比...3.在recyclerView对应的adapter中,在onCreateViewHolder初始化视频操作,同时当onViewRecycled时,销毁视频资源。...如果你接触过SnapHelper应该了解一下LinearSnapHelper和PagerSnapHelper这两个子类类,LinearSnapHelper可以实现让列表的Item居中显示的效果,PagerSnapHelper...就可以做到一次滚动一个item显示的效果。
双窗格会一直存在,但根据屏幕的尺寸,第二窗格可能不会显示在可视范围当中。只有在给定的窗格宽度下仍然有足够的空间时,SlidingPaneLayout 才会同时将两者显示出来。...经过一些实验,我们发现即使是在大屏幕的平板上,竖屏模式同时显示出双窗格内容会使得信息的显示过于密集,所以这两个宽度值可以保证只在横屏模式下才同时展现全部窗格的内容。...0dp 8dp 我们通过在 XML 文件中把 app:layoutManager 的值设置为刚才的字符串资源,然后同时设置 android:orientation 和 app:spanCount 实现布局管理器的配置...用于 android:paddingHorizontal 的尺寸资源同时也被用于另一个属性 app:itemSpacing。它不是 RecyclerView 的标准属性,那它从何而来?...将 RecyclerView 自身的内边距也设置为相同的值,会使得元素同 RecyclerView 边界的距离与元素间的空隙保持相同的大小,在元素周围形成统一的留白。
mAttachedScrap 表示屏幕内未与RecyclerView分离的ViewHolder列表。值得注意的是mAttachedScrap是不限制大小的。...我们可以通过以下方法来设置mCacheViews的最大值。...也就是说,它只能缓存已经显示过的ViewHolder。显而易见,它的主要作用是让已经显示过的ViewHolder需要再次显示时,能够快速显示。...RecyclerView中,mCachedViews的默认大小为2 。但mCachedViews我们是可以修改的,缓存的越多,用户回看时就越快,同时消耗的内存也越多。这是一个内存和时间置换的配置。...这样,当我们刷新数据时,RecyclerView就能确认是否数据没有变化,ViewHolder也直接复用,减少重新布局的烦恼。同时,由于ViewHolder没有变动,可以去掉动画。
Float action button 有一个默认的 behavior 可以在检测到 Snackbar 被加入的同时将这个 button 向上移动 Snackbar 的高度。...通常,只有当 list 滑到顶部的时候 Toolbar 才会显示,如下所示: ?...如果这个值大于它的 50%,它将完全消失。 ? 注意:在你脑海中要将使用了 scroll 标志位的 view 放在首位。这样,被折叠的 view 将会首先退出,留下在顶部固定着的元素。...创建视差动画 CollapsingToolbarLayout 可以让我们做出更高级的动画,例如使用一个在折叠的同时可以渐隐的 ImageView。在用户滑动时,标题的高度也可以改变。 ?...Persistent 类型的底部表显示应用内的内容,而 modal 类型的则显示菜单或者简单的对话框。 ? Persistent 形式的底部表 有两种方法来创建 Persistent 形式的底部表。
这里要明确一点,Toolbar本身是页面顶部的工具栏,其上没有本页面的其它控件了,如果Toolbar被拉下来了,那Toolbar上面的空白该显示什么?...--none : 默认值。CollapsingToolbarLayout折叠多少距离,则当前视图也移动多少距离,通俗地说,就是夫唱妇随。...下面是标题栏在折叠时显示渐变图片的效果图: ?...同时声明scroll和exitUntilCollapsed,滚动效果如下图所示: ?...同时声明scroll和snap,滚动效果如下图所示: ?
Lazy Layout大概就相当于View系统中的ListView和RecyclerView。 这样类比一下相信大家一下子就懂了。同时,也应该意识到这是多么重要的一个控件了吧。...,接下来将它们同时显示到Text控件上即可,效果如下图所示: 边距设置 相信你也看出来了,目前的Lazy Layout并不美观,主要是因为每个子项之间没有很好的边距,互相都糅杂在了一起,这也是Lazy...这个Fab按钮可以提供一些常用的便捷操作,但同时也会遮盖一部分界面,如果一直显示的话对于用户来说并不友好。...方案就是,我们需要找到一个能够标识子项唯一性的id值,用于替换之前基于位置变动去触发重组的机制。 至于这个id值是什么?在哪里?你要自己想办法。...由于我们所使用的数据A-Z本身每个值就是唯一的,因此这里直接指定it即可。
可能你没有想到这个界面会是一个RecyclerView,但是它确实就是如此,界面中的内容主要分成了如上图所示的3部分。 那么一个RecyclerView中怎么能显示3种完全不同的内容呢?...:recyclerview:1.2.0-alpha02' } 接下来创建两个非常简单的Adapter,一个TitleAdapter和一个BodyAdapter,待会我们会用MergeAdapter将这两个...position: Int) { holder.text.text = items[position] } } 这是一个Adapter最简单的实现,没有任何逻辑在里面,只是为了显示一行文字...$index") } return list } } 可以看到,这里我编写了generateTitleItems()和generateBodyItems()这两个方法...可以看到,TitleAdapter和BodyAdapter中的数据是合并到一起显示的,同时也就说明,我们的MergeAdapter已经成功生效了。
实现上图列表的粘性头部功能一般通过在布局页面额外写粘性头部View,然后通过监听列表的滑动来控制显示隐藏粘性头部View。...如下图所示: #######onDraw(Canvas c, RecyclerView parent, State state) 这个方法可以实现类似绘制背景的效果,绘制的东西是显示在item的下层,一般配合...我们先看下这两个方法在 RecyclerView中调用位置,从下面也可以看得出来decoration 的onDraw(),child view 的 onDraw(),decoration 的 onDrawOver...这样就会调用RecyclerView的onDraw(),onDrawOver()方法,因此ItemDecoration的这两个方法就在不断的调用。..., RecyclerView.State state) { super.onDrawOver(c, parent, state); //mHeaderRects为存放屏幕上显示的
同时,在熟悉了在自定义LayoutManager后,还可以根据需要调整RecyclerView的展示效果。 ?...当左滑后子View被左移动时,RecyclerView的右侧会出现可见的未填充区域,这时需要在RecyclerView右侧添加并布局好新的子View,直到没有可见的未填充区域为止。 ?...同样,在右滑后需要对左侧的未填充区域进行填充。...进行滑动时,需要对可见的未填充区域进行填充。...在RecyclerView中,需要在滑动、填充可见区域的同时,对不可见区域的子View进行回收,这样才能体现出RecyclerView的优势。 回收的方向与填充的方向恰好相反。
3.3 简单使用 先看一下结合 MVVM 架构如何快速实现简单的列表数据显示以及列表数据更新功能。...> 布局里通过 DataBinding 传入了一个 String 类型的 item 变量,并将这个变量绑定到了 TextView 的 text 属性上,即对 TextView 设置显示的字符串值...这里的 BR.item和 BR.handler是 DataBinding 根据布局里使用的变量自动生成的,所以为了生成这两个变量,建了一个空的布局文件,定义了这两个变量,如下: <?...数据有了,getItemCount方法的实现就有了,同时为了方便根据 position 获取 item 的数据,这里也提取了一个 getItem方法,实现如下: fun getItem(position...Int) : BaseBindingAdapter() 只传入了一个参数,即 item 布局 id,将其作为 layoutRes 的 get 返回值。
简介 先上个小米日历的图,让大家知道要做一个什么效果: [strip] 这是小米日历的效果,在用户操作列表的时候,将日历折叠成周视图,扩大列表的显示区域,同时也不影响日历部分的功能使用,有趣且实用。...这个库比较流行,它支持周月视图的切换,符合 Material Design,也可以自定义显示效果。...onStartNestedScroll 的返回值决定是否接收嵌套滑动事件。...MaterialCalendarView child, View target, int dx, int dy, int[] consumed, int type) { // 列表未滑动到顶部时...我们可以从 onNestedPreFling 拿到滑动速度,方法的返回值决定了是否进行惯性嵌套滑动: @Override public boolean onNestedPreFling(CoordinatorLayout
实现效果 根据上面的视频我们可以看到,做了一个检测App是否已经安装,如果未安装直接下载并安装的小Demo效果,接下来我们说说实现方式。...实现思路 定义一个AppInfo的类,里面有App的名称,包名、下载地址,存放的路径及当前的状态标志(未安装,已下载,已安装),再加一个判断当前标志的函数, 利用我们《学习|Android检测并自动下载安装包...的布局,显示程序中文名及包名,右边为进度条的按钮,这样可以实时看到下载进度。...installed } } } DownloadHelper(划重点、新的知识点) DownloadHelper前面文章也列出来过,这里一开始直接套用了,在测试过程中发现几个APP同时下载时点击是无反应的...interface OnItemStatusChange { fun onRefreshAll() } 上在最后我加了一个了OnItemStatusChange的接口,在下载完或安装是周用重新刷新一下界面显示的
领取专属 10元无门槛券
手把手带您无忧上云