触摸事件后,RecyclerView快速滚动不起作用的原因可能是由于以下几个方面引起的:
对于以上问题,可以参考腾讯云提供的相关产品和文档来解决:
以上链接提供了腾讯云在各个领域的相关产品和服务,可以根据具体需求选择适合的产品来解决RecyclerView快速滚动不起作用的问题。
简评:Android Support Library 26 中终于实现了一个等待已久的功能: RecyclerView 的快速滚动 。...Android 官方早就在建议开发者使用 RecyclerView 替代 ListView,RecyclerView 也确实表现要好于 ListView,除了没有快速滚动,就像下面这样: ?...因此,之前要想在 RecyclerView 上实现快速滚动,往往是依赖第三方库,比如:FutureMind/recycler-fast-scroll 或 timusus/RecyclerView-FastScroll...现在 RecyclerView 终于原生支持了快速滚动,现在就让我们来看一下怎么实现: 首先,在 build.gradle 中添加依赖: dependencies { .......现在,来看一看具体怎么实现 RecyclerView 的快速滚动: <?xml version="1.0" encoding="utf-8"?
android:scaleType="fitXY" app:shapeAppearance="@style/BannerStyle" /> ④我们都知道ViewPager2的适配器和RecyclerView...currentPosition = position } override fun onPageScrollStateChanged(state: Int) { //只有在空闲状态,才让自动滚动...bannerVp.postDelayed(counter,1000) }else{ //失去焦点时移除 bannerVp.removeCallbacks(counter) } } 触摸暂停滚动...我们知道触摸调用setOnTouchListener即可,但是给ViewPager2使用的时候你会发现不起作用。...ViewPager2是一个视图组,未调用setOnTouchListener是因为recyclerview拦截事件并首先调用onTouchEvent bannerVp.getChildAt(0)给它设置监听即可
currentPosition = position } override fun onPageScrollStateChanged(state: Int) { //只有在空闲状态,才让自动滚动...bannerVp.postDelayed(counter,1000) }else{ //失去焦点时移除 bannerVp.removeCallbacks(counter) } }触摸暂停滚动...方法进行实现 mLooper是我定义的Runnable,后面会讲原因 滑动实现了,但启停时机也很重要 所以这里选用onWindowFocusChanged因为它在窗体失去和获得焦点的时候会通知我们 我们知道触摸调用...setOnTouchListener即可,但是给ViewPager2使用的时候你会发现不起作用。...ViewPager2是一个视图组,未调用setOnTouchListener是因为recyclerview拦截事件并首先调用onTouchEvent bannerVp.getChildAt(0)给它设置监听即可
我们观察RecyclerView的源码,在onInterceptTouchEvent方法中对事件做了处理 @Override public boolean onInterceptTouchEvent...,RecyclerView中只做了距离判断,只要滑动的距离大于系统的默认滑动距离阈值,则本身进行滑动,这就导致了为什么我们水平滑动的时候,子RecyclerView接收不到Touch事件的原因,我们针对这点进行优化...拦截事件 RecyclerView嵌套RecyclerView滑动2.gif 这时,发现了另一个问题,当子RecyclerView快速滑动,还没有停止滚动时,我们去竖直滑动,发现父RecyclerView...事件,一般被子类调用getParent.requestDisallowInterceptTouchEvent(true) * 比如快速水平滑动子view的时候,这时我们想去竖直滑动父类,因为快速滑动有一个速度...,子view还没停止滚动,所以子类禁止父类拦截 * 想要解决这个办法,就把这个方法改为空方法就行了 * * @param disallowIntercept */
在嵌套滑动控件的场景中,可以在Android的事件分发机制本身做一些处理,外部拦截或者内部消化触摸事件。...如果滑动的时候不拦截的话,手势事件会交给子view去处理,如果子view是可以滚动的,这时候就会有冲突,所有滚动的时候事件要拦截下来交给自己处理。...,让父布局不要拦截事件, 当 mIsBegingDragged 为true的时候,分发嵌套预滚动事件。...接着分发嵌套滚动事件,中间还有一些针对 Scroll mode的处理,我们这里不关心: UP 的时候会根据距离判断是否需要消费快速滑动,如果不则会进行分发: 所以我们需要关注的就是: startNestedScroll...也就是把拦截触摸事件的行为交给了自己的 Behavior .
当RecyclerView内容过多,超出屏幕的时候,需要让它自己滚动展示数据,尤其是某些Android设备处于高处,或是不可被触摸点击的,这样的情况下,让其自己滚动展示数据尤为重要了 自动滚动的方案有很多种...class AutoPollRecyclerView : RecyclerView { var autoPollTask //滚动线程 : AutoPollTask?...(autoPollTask) } companion object { private const val delayTime: Long = 50 //间隔多少时间后执行滚动...} } 上面代码实现了最基本的滚动功能,但有时候Adnroid设备可以触摸的话,而当前recyclerview正在滚动,又去滑动它,那就会造成界面错乱,数据错乱了,所以还需要重写拦截onTouchEvent...方法,当触摸到recyclerview的时候,即在ACTION_DOWN的时,停止滚动线程,在ACTION_UP、ACTION_CANCEL时再开启线程。
和Fragment 3.3 修改滑动距离翻页 3.4 修改滑动速度 04.用RecyclerView实现 4.1 自定义LayoutManager 4.2 添加滑动监听 4.3 监听页面是否滚动 4.4...不太建议使用ViewPager 1.ViewPager 自带的滑动效果完全满足场景,而且支持Fragment和View等UI绑定,只要对布局和触摸事件部分作一些修改,就可以把横向的 ViewPager...2.滑动事件处理比viewPager好,即使你外层嵌套了下拉刷新上拉加载的布局,也不影响后期事件冲突处理,详细可以看demo案例。...为何选择使用FragmentStatePagerAdapter,主要是因为使用 FragmentStatePagerAdapter更省内存,但是销毁后新建也是需要时间的。...空闲时选中的Item,重写LinearLayoutManager的onScrollStateChanged方法/** * 滑动状态的改变 * 缓慢拖拽-> SCROLL_STATE_DRAGGING * 快速滚动
整体的滑动流程如图所示: image.png 当手指触摸屏幕时,记录位置,滑动后,判断是横向竖向,只判断一次 如果是上下滑动,则判断是触发最外层 LinearLayout 的滑动,还是触发 RecyclerView...出现问题时,用户的手先触发左右滑动,这时候由于 RecyclerView 父布局 ViewPager 中的一些临界判断没被触发,所以没拦截事件,事件还是到了 RecyclerView 中,此时如果再次上下滑动...,由于1中的判断单次滑动周期内只触发了一次,还被认为是左右滑动事件,所以 LinearLayout 布局本身没有滚动,但是 RecyclerView 正常响应滚动,导致的出现滑动偏差。...修改后的代码: image.png 到此横向判断的过滤条件写好了。...如果有则啥也不做,如果没有,那么我们判断是不是要最外层的 LinearLayout 消费其中的竖向部分,满足条件后,自身消费事件滚动。
答案是肯定的,今天就为大家介绍一个牛逼的库,drag-select-recyclerview,可以轻松实现recyclerView 拖动多选。...DragSelectTouchListener 是这个库的核心类,该库将会处理拖动事件拦截和自动滚动逻辑,当拖动到recyclerView 顶部的时候,列表将继续滚动,反之亦然。...使用的时候,将DragSelectTouchListener attache 到 RecyclerView,它将会处理触摸事件的拦截,然后通过一个receiver 来返回结果和更新UI。...结合RecyclerView使用如下: val recyclerView: RecyclerView = // ... val receiver: DragSelectReceiver = // ......0 is the initial selected index touchListener.setIsActive(true, 0) 通过设置setIsActive ,当用户长按列表Item时,触发事件开始拖动选择
enterAlways:这个flag让任意向下的滚动都会导致该view变为可见,启用快速“返回模式”。...scrollFlags滚动事件(移除屏幕或固定在屏幕顶端)。...只要将Behavior绑定到CoordinatorLayout的直接子元素上,就能对触摸事件(touch events)、window insets、measurement、layout以及嵌套滚动(nested...,这个behavior需要设置在触发事件(滚动)的view之上。...RecyclerView的任意滚动事件都将触发AppBarLayout或者AppBarLayout里面view的改变。
要使用RecyclerView,请参考 ,其实你也可以只下载一个jar包,添加到自己的libs里就能使用它了,Recycler.jar 使用它的理由: RecyclerView is a more...在android滑动组件嵌套一般思路,多任务手势思路,触摸传递思路,【例】listview嵌套viewpager 中我介绍了ListView嵌套ViewPager显示图片的办法。...一次长距离的滑动可能只造成1~2张图片的滚动,一点也不像gallery,这是我用RecylcerView替代它的主要原因。...基于原来的代码,我构建了MyRecyclerGallery,保留了原来的触摸事件,现在滑动起来舒服多了: ? 你可以看到滑动时还有滚动条。...事件机制和原来一样,RecyclerView的关键代码没有变化,所以就不放出源码了。
所以我们能够理解为,RecyclerView一个恰当的使用场景是:由于尺寸限制,用户的设备不能一次性展现所有条目,用户需要上下滚动以查看更多条目。...左边的图是数据初始化后的示例,当向上滚动视图的时候,当条目不可见之后将被回收。右图中红色区域内的两条不可见条目,将被放到缓存队列中以便新的条目可见时进行复用。...定制Item条目 - ListView只能实现垂直线性排列的列表视图,与之不同的是,RecyclerView可以通过设置RecyclerView.LayoutManager来定制不同风格的视图,比如水平滚动列表或者不规则的瀑布流列表...但是,很遗憾的是在RecyclerView中,并没有提供这样的接口,不过,提供了另外一个接口RcyclerView.OnItemTouchListener,用来响应条目的触摸事件。...) Item点击事件监听 public void setOnItemLongClickListener(OnItemLongClickListener listener) Item长按事件监听 但是存在这样一个触摸事件的监听
但是RecyclerView的出现会让很多开源项目被废弃,例如横向滚动的ListView, 横向滚动的GridView, 瀑布流控件,因为RecyclerView能够实现所有这些功能。...setOnItemClickListener()和setOnItemLongClickListener()设置点击事件和长按事件。...具体实现如下: 然后通过以下代码为RecyclerView设置该滑动、拖拽功能: 前面拖拽的触发方式只有长按,如果想支持触摸Item中的某个View实现拖拽,则核心方法为helper.startDrag...嵌套滑动机制 Android 5.0推出了嵌套滑动机制,在之前,一旦子View处理了触摸事件,父View就没有机会再处理这次的触摸事件,而嵌套滑动机制解决了这个问题,能够实现如下效果: 为了支持嵌套滑动...表示退出后折叠。
interface RecyclerView.OnChildAttachStateChangeListener 如果将该监听器接口对象设置给 RecycleView 后, 当 ViewHolder 从...的层级中触摸事件被当做 RecycleView 自己的滚动操作, 设置了该监听器, 就可以在 RecycleView 将触摸事件当做滚动事件之前拦截这些触摸操作. class RecyclerView.OnScrollListener...滚动监听器 (OnScrollListener) 被设置给 RecycleView 后, 当滚动事件被触发时, 可以接收滚动相关的信息. class RecyclerView.RecycledViewPool...或者 被分离的 项目组件 以用于复用. interface RecyclerView.RecyclerListener 循环复用监听器 : 设置给 RecycleView 后, 当 View 组件被复用时... listener) 添加一个项目触摸监听器用于监听触摸事件, 在这些事件被传给子组件 或者 在 RecycleView 级别上被 当做滚动事件 前, 拦截这些事件
但是RecyclerView的出现会让很多开源项目被废弃,例如横向滚动的ListView, 横向滚动的GridView, 瀑布流控件,因为RecyclerView能够实现所有这些功能。...setOnItemClickListener()和setOnItemLongClickListener()设置点击事件和长按事件。...嵌套滑动机制 Android 5.0推出了嵌套滑动机制,在之前,一旦子View处理了触摸事件,父View就没有机会再处理这次的触摸事件,而嵌套滑动机制解决了这个问题,能够实现如下效果: ?...表示退出后折叠。...回顾 回顾整篇文章,发现我们已经实现了RecyclerView的很多扩展功能,包括:打造万能适配器、添加Item事件、添加头视图和尾视图、设置空布局、侧滑拖拽。
从这篇文章主要梳理以下几点: 优雅的实现:item 点击事件 & item 长点击事件 RecyclerView 添加 divider 的标准姿势 RecyclerView 实现 item 的拖曳排序和滑动删除...长点击事件 使用方式 RecyclerView 的 api 虽然没有提供 onItemClickListener 但是提供了 addOnItemTouchListener() 方法,既然可以添加触摸监听...,那么我们完全可以获取触摸手势来识别点击事件,然后通过触摸坐标来判断点击的是哪一个item。...这里值得说的是:当获取到了 RecyclerView 的点击事件和触摸事件数据 MotionEvent,那么如何才能知道点击的是哪一个 item 呢?...layoutManager) .getOrientation(); // StaggeredGridLayoutManager 且纵向滚动
根据滑动冲突的相关知识,我们知道一定是外层RecyclerView拦截了触摸事件,内层RecyclerView无法获取事件,就无法滑动了。...开头提到的博客中有说明: 从view事件分发机制 我们知道,当parent View拦截事件后,那同一事件序列的事件会直接都给parent处理,子view不会接受事件了。...NestedScrolling(嵌套滑动)机制,简单说来就是:产生嵌套滑动的子view,在滑动前,先询问 嵌套滑动对应的父view 是否优先处理 事件、以及消费多少事件,然后把消费后剩余的部分 继续给到...[1] = dy; }else { //内层已滚动的距离,小于想要滚动的距离,那么内层消费一部分,到顶后,剩的还给外层自行滑动...,大于想要滚动的距离,内层自行处理 }else { //内层已滚动的距离,小于想要滚动的距离,那么内层消费一部分,到顶后,剩的外层滑动
MotionEvent在android的触摸事件中起到了很重要的作用,本文主要介绍MotionEvent,简要介绍触摸事件,主要包括 单点触控、多点触控、鼠标事件 以及 getAction() 和 getActionMasked...getX() 获得触摸点在当前 View 的 X 轴坐标。 getY() 获得触摸点在当前 View 的 Y 轴坐标。 getRawX() 获得触摸点在整个屏幕的 X 轴坐标。...,然而接下来又传递过来了一个 ACTION_MOVE 事件,且移动的方向和 RecyclerView 的可滑动方向一致,所以 RecyclerView 判断这个事件是滚动事件,于是要收回事件处理权,这时候对应的...(move) 追踪事件流,请认准 PointId,不能通过ActionIndex PointId 在手指按下时产生,手指抬起或者事件被取消后消失,是一个事件流程中唯一不变的标识,可以在手指按下时 通过...ACTION_SCROLL 滚轮滚动,可以触发水平滚动(AXIS_HSCROLL)或者垂直滚动(AXIS_VSCROLL) 注意: 1、这些事件类型是 安卓4.0 (API 14) 才添加的。
ScrollView 视图的滚动过程,其实是在不断修改原点坐标。当手指触摸后,ScrollView会暂时拦截触摸事件,使用一个计时器。...假如在计时器到点后没有发生手指移动事件,那么ScrollView发送tracking events到被点击的subView;若是在计时器到点后发生了移动事件,那么ScrollView取消tracking...自己促发滚动。...scrollview 不像recyclerview一样可以监测滑动状态。...public void onScroll(int l, int t, int oldl, int oldt) { if (isDragState) {//拖动状态单独处理不再进行滚动状态监测
领取专属 10元无门槛券
手把手带您无忧上云