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

Viewpager2 + RecyclerView滚动问题

Viewpager2是Android Jetpack中的一个组件,用于实现水平滑动的页面切换效果。RecyclerView是Android中常用的列表展示控件。在使用Viewpager2和RecyclerView组合时,可能会遇到滚动问题。

滚动问题通常指的是在Viewpager2中嵌套RecyclerView时,滑动RecyclerView时会触发Viewpager2的页面切换。这是因为RecyclerView默认会拦截滑动事件,导致滑动事件无法传递给Viewpager2。

为了解决这个问题,可以通过以下两种方式之一:

  1. 使用NestedScrolling机制:Viewpager2和RecyclerView都支持NestedScrolling机制,可以通过设置RecyclerView的NestedScrollingEnabled属性为false,禁用RecyclerView的滑动事件拦截,使滑动事件能够传递给Viewpager2。代码示例如下:
代码语言:txt
复制
recyclerView.setNestedScrollingEnabled(false);
  1. 自定义RecyclerView的LayoutManager:通过自定义RecyclerView的LayoutManager,重写canScrollHorizontally()方法,判断RecyclerView是否可以水平滚动。如果RecyclerView可以水平滚动,则不拦截滑动事件,否则将滑动事件传递给Viewpager2。代码示例如下:
代码语言:txt
复制
public class CustomLayoutManager extends LinearLayoutManager {
    public CustomLayoutManager(Context context) {
        super(context);
    }

    @Override
    public boolean canScrollHorizontally() {
        return false; // 禁止RecyclerView水平滚动
    }
}

然后在使用RecyclerView时,使用自定义的LayoutManager:

代码语言:txt
复制
recyclerView.setLayoutManager(new CustomLayoutManager(context));

以上是解决Viewpager2 + RecyclerView滚动问题的两种常用方法。根据具体情况选择适合的方法进行处理。

关于Viewpager2和RecyclerView的更多信息,可以参考腾讯云的相关文档和示例代码:

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

相关·内容

ViewPager2使用入门

如果你在RecyclerView中的Item使用ViewPager,你绝对会产生莫名其妙的问题,因为ViewPager在同一界面上不能有两个一样的ID,否则会导致滑动和内存问题。...// 首先贴一下库的引用地址 implementation 'androidx.viewpager2:viewpager2:1.0.0' implementation 'androidx.recyclerview...FragmentStatePagerAdapter 被 FragmentStateAdapter 替代 PagerAdapter 被 RecyclerView.Adapter 替代 最简单的使用 ViewPager2...是内部使用了RecyclerView,最简单用法就是设置一个Adapter即可马上使用,下面的ViewPager2默认是横向滚动ViewPager2 vp2 = mRootView.findViewById...(use match_parent) 垂直滚动的特性 ViewPager2支持横向和垂直滚动,只需要在xml中通过android:orientation指定方向: <androidx.viewpager.widget.ViewPager

1.8K10

ViewPager2实现内部Item的动态滚动

当然RecyclerView也可以,用一个仿抖音的那种 LayoutManager 就行,但是为什么不呢,因为涉及到了视频播放,手动去处理一些生命周期和懒加载,总是非常麻烦,而且ViewPager2本身就是基于...解决方法 既然如此,ViewPager2是基于RecyclerView,那么我去调用RecyclerView滚动不就行吗,思路如下: ViewPager2-> RecyclerView, RecyclerView...默认是私有的,可以通过反射或者 getChildAt(0) 获取 RecyclerView不支持 scrollTo() ,可以通过 LinearLayouManager 去滚动 LinearLayoutManager-scrollToPositionWithOffset...layoutManager.scrollToPositionWithOffset(0, it.animatedValue as Int) } oneAnimator.start() 效果如最上面示例gif所示,这样就解决了ViewPager2-item动态滚动问题...后续 当然用ViewPager2去写仍然有种大材小用的感觉,毕竟只有两个item,所以,比较好的方式依然是使用自定义的滑动ViewGroup实现,所以我会在下篇博客来以一个自定义的方式来解决此问题

1.5K20

Android MVVM框架搭建(四)RecyclerVIew + ViewPager2 + BaseQuickAdapter

Android MVVM框架搭建(四)RecyclerVIew + ViewPager2 + BaseQuickAdapter 前言 正文 一、图片列表数据 二、新增访问地址和接口 三、访问接口 四、RecyclerView...那么同样的这个接口每天也只需要请求一次即可,后面对这个再做处理,前面先解决列表显示的问题。...没啥问题,下面进入图片点击之后进入新的页面中去显示壁纸。...因为ViewPager2可以在setAdapter时直接设置RecyclerView.Adapter,很方便,因此这里同样需要一个适配器,这里的适配器我不打算用原生的来写。 2....这里还有一个问题,就是在上一个页面点击的位置,没有与当前页面的位置一致,所需还需要设置一下。

2.6K10

恢复 RecyclerView滚动位置

您可能在开发过程中遇到过这种情况,在 Activity/Fragment 被重新创建后,RecyclerView 丢失了它之前保有的滚动位置信息。...通常这种情况发生的原因是由于异步加载 Adapter 数据,且数据在 RecyclerView 需要进行布局的时候尚未加载完成,导致 RecyclerView 无法恢复到之前的滚动位置。...从  1.2.0-alpha02 版本开始,Jetpack RecyclerView 提供了一个新的 API,可以让 Adapter  在数据加载完成之前阻塞布局行为 ,从而避免丢失滚动位置信息。...恢复至原有滚动位置 有好几种方法可以用来恢复 RecyclerView 至正确的滚动位置,您可能已经在实际项目中用到了这些方法。...如果根据您的项目实际情况无法采用这种方法,那也可以使用其他的方法,只是要么比较复杂 (比如避免在 RecyclerView 中设置 Adapter,但这样又有可能导致像 header 等 item 的显示问题

1.4K10

Android MVVM框架搭建(四)RecyclerVIew + ViewPager2 + BaseQuickAdapter

Android MVVM框架搭建(四)RecyclerVIew + ViewPager2 + BaseQuickAdapter 前言 正文 一、图片列表数据 二、新增访问地址和接口 三、访问接口 四、RecyclerView...那么同样的这个接口每天也只需要请求一次即可,后面对这个再做处理,前面先解决列表显示的问题。...没啥问题,下面进入图片点击之后进入新的页面中去显示壁纸。...因为ViewPager2可以在setAdapter时直接设置RecyclerView.Adapter,很方便,因此这里同样需要一个适配器,这里的适配器我不打算用原生的来写。 2....这里还有一个问题,就是在上一个页面点击的位置,没有与当前页面的位置一致,所需还需要设置一下。

2K20

ViewPager2打造轮播Banner

的适配器和RecyclerView的使用一样,这里就不贴代码了 ⑤最后我们给ViewPager2设置上adapter即可 二、轮播图左右无线滑动 数据源的第一位add最后一张图val newList =...currentPosition = position } override fun onPageScrollStateChanged(state: Int) { //只有在空闲状态,才让自动滚动...bannerVp.postDelayed(counter,1000) }else{ //失去焦点时移除 bannerVp.removeCallbacks(counter) } }触摸暂停滚动...bannerVp.postDelayed(mLooper,1000) } } return@setOnTouchListener false }最后写作不易,如果对你有一丢丢帮助或启发,感谢点赞支持,有问题也欢迎留言交流哦...ViewPager2是一个视图组,未调用setOnTouchListener是因为recyclerview拦截事件并首先调用onTouchEvent bannerVp.getChildAt(0)给它设置监听即可

1.7K30

教你简单实现RecyclerView自动滚动

RecyclerView内容过多,超出屏幕的时候,需要让它自己滚动展示数据,尤其是某些Android设备处于高处,或是不可被触摸点击的,这样的情况下,让其自己滚动展示数据尤为重要了 自动滚动的方案有很多种...,目前比较常见又最简单的一种是:继承至RecyclerView,并实现runnable方法,每间隔10ms(delayTime)就去执行scrollby(x,y)方法,其中delayTime和x,y的值决定了滚动速度...class AutoPollRecyclerView : RecyclerView { var autoPollTask //滚动线程 : AutoPollTask?...} } 上面代码实现了最基本的滚动功能,但有时候Adnroid设备可以触摸的话,而当前recyclerview正在滚动,又去滑动它,那就会造成界面错乱,数据错乱了,所以还需要重写拦截onTouchEvent...方法,当触摸到recyclerview的时候,即在ACTION_DOWN的时,停止滚动线程,在ACTION_UP、ACTION_CANCEL时再开启线程。

67440

Android ViewPager2 真的香么?

版本 ViewPager2 目前处于预览版,还没有合并到主分支,可能还会有一些隐藏小问题,建议大家先尝试一下; implementation 'androidx.viewpager2:viewpager2...:1.0.0-alpha02' 问题 和尚尝试第一步要引入 ViewPager2,而此时就出现一个大问题,如下: ?...和尚当前 SDK 已是最新版本,首先按照提示在 AndroidManifest->application 添加错误中要求的,但是并不能解决问题,之后查阅了很多资料,发现 Androidx 与 Android...尝试 和尚尝试绑定不同背景色和文字内容;与 ViewPager 不同的是,适配器需要使用 RecyclerView.Adapte,这也意味着绑定数据的方式更灵活,和尚为了测试 ViewPager2...list.size() : 0; } class MyViewHolder extends RecyclerView.ViewHolder { LinearLayout

2.1K31

Android 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"?

1.2K31

Android开发笔记(一百七十二)第二代翻页视图ViewPager2

正如RecyclerView横空出世取代ListView和GridView那样,Android也推出了二代翻页视图ViewPager2,打算替换原来的翻页视图ViewPager。...与ViewPager相比,ViewPager2支持更丰富的界面特效,包括但不限于下列几点: 1、不但支持水平方向翻页,还支持垂直方向翻页; 2、支持RecyclerView.Adapter,允许调用适配器对象的...注意RecyclerViewViewPager2拥有各自的AndroidX库,故需修改模块的build.gradle,在dependencies节点内部补充以下两行依赖配置:     implementation...'androidx.recyclerview:recyclerview:1.1.0'     implementation 'androidx.viewpager2:viewpager2:1.0.0'...先在测试页面的Java代码中补充下面几行:     // ViewPager2支持展示左右两页的部分区域     RecyclerView cv_content = (RecyclerView) vp2

2.1K30
领券