嵌套的RecyclerView和ViewPager内容包装和滚动不能很好地协同工作

时间:2018-02-05 06:24:33

标签: android android-layout android-recyclerview android-viewpager

我已经嵌套了ViewPagers和RecyclerViews,如图所示:

enter image description here

要求:

  • 第一级ViewPager1从左向右滑动。它使用FragmentStatePagerAdapter。
  • 第一级RecyclerView1垂直滚动。
  • 第二级ViewPager2不会滑动 - 滑动动作由TabLayout控制。它使用自定义的PagerAdapter将View作为页面返回。
  • 第二级RecyclerView不会滚动 - 它只是包装一个动态项列表

到目前为止我的工作:

  1. 第一级ViewPager1和RecyclerView1按预期工作。
  2. ViewPager2未显示,因为其高度定义为“wrap_content”
  3. ViewPager2 / RecyclerView2阻止RecyclerView1向上/向下滚动。
  4. 我尝试过:

    1. 设置RecyclerView1.setNestedScrollingEnabled(false)会阻止它将onTouch事件传递给其子项,但由于ViewPager2 / RecyclerView2包装其内容,因此它不知道滚动所需的大小。
    2. 将ViewPager2设置为固定高度可解决滚动问题。但由于它是一个固定的高度,RecyclerView2的内容被切断了。
    3. 如上所述覆盖OnMeasure here使ViewPager2的内容完美,但滚动不再有效。我认为是因为OnMeasure被称为“之后”View已被附加?
    4. 所以基本上我需要有关如何获取内容的帮助,但这样的方式是RecyclerView 1知道高度是什么,以便它可以滚动。

      修改

      1. 事实证明我完全不在第3点.OnMeasure解决方法按预期工作,滚动问题不是由recyclerView不知道高度引起的。事实上确实如此。它不滚动的原因是由于多个嵌套的可滚​​动视图组。我通过在所有可滚动视图组上的onTouchEvent()和onInterceptTouchEvent()上放置Log.i来找到它。视图的某些表面可以工作,但如果表面有另一个可滚动的子节点,则会导致问题。
      2. 设置RecyclerView2.setNestedScrollingEnabled(false)修复了垂直滚动。但是,现在,ViewPager2的触摸行为正在干扰ViewPager1的
      3. 仔细观察,ViewPager1在遇到不可滚动的曲面时拦截触摸事件,导致ViewPager1调用其onTouchEvent()向左和向右滚动。但是,如果我在ViewPager2的表面上启动触摸事件,ViewPager1永远不会拦截,它从不处理从左到右的滑动。
      4. 与RecyclerView不同,没有简单的方法可以禁用nestedScrolling。所以我尝试禁用ViewPager2,但这不起作用,导致内部视图如按钮无法点击。
      5. 我试图在ViewPager2的OnTouchEvent中返回false,以便它在链中冒泡,但是,ViewPager1的OnTouchEvent永远不会被触发。
      6. 所以我再次陷入困境,当父母没有拦截事件时,如何将触摸事件传递给父母。再一次,我假设,并且我可能会偏离基础,ViewPager1可能不会拦截因为ViewPager2在其代码中的某处请求了disallowInterceptTouchEvent()?我只是不知道在哪里或如何开始解决这个问题。

0 个答案:

没有答案