水平和垂直回收器视图中的滚动问题
Posted
技术标签:
【中文标题】水平和垂直回收器视图中的滚动问题【英文标题】:Scroll issues in horizontal and vertical recyclerview 【发布时间】:2019-07-27 06:22:39 【问题描述】:我有一个带有 ViewPager 的 MotionLayout。在 ViewPager 托管的片段之一中,我有一个带有两个水平 RecyclerView 的垂直 RecyclerView。垂直滚动效果很好,但是,当我尝试在内部 RecyclerViews 上水平滚动时,它不能很好地工作。它似乎试图垂直滚动(这里的问题视频:https://youtu.be/94rQ5Qkr2ew)我怀疑这与我正在使用的视图组合有关,但我不完全确定如何修复它或弄清楚是什么错误的。我已经在内部(水平)RecyclerView 上尝试过这个,它似乎没有太大的区别:
recyclerView.setOnTouchListener((v, event) ->
int action = event.getAction();
View
switch (action)
case MotionEvent.ACTION_CANCEL:
v.getParent().requestDisallowInterceptTouchEvent(false);
case MotionEvent.ACTION_UP:
v.getParent().requestDisallowInterceptTouchEvent(false);
case MotionEvent.ACTION_MOVE:
v.getParent().requestDisallowInterceptTouchEvent(true);
break;
return false;
);
这是 MotionLayout 容器的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout android:id="@+id/container"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical"
app:layoutDescription="@xml/motion_scene_home_tab">
<com.github.florent37.shapeofview.shapes.DiagonalView
android:id="@+id/header"
android:layout_
android:layout_
android:elevation="@dimen/header_elevation_expanded"
app:layout_constraintBottom_toTopOf="@+id/guideline"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:shape_diagonal_angle="@dimen/menu_header_angle"
app:shape_diagonal_direction="left"
app:shape_diagonal_position="bottom">
<View
android:id="@+id/background"
android:layout_
android:layout_
android:background="@color/redE64"/>
</com.github.florent37.shapeofview.shapes.DiagonalView>
<TextView
android:id="@+id/toolbar_title"
style="@style/title.white"
android:layout_
android:layout_
android:layout_gravity="center"
android:ellipsize="end"
android:gravity="center"
android:maxLines="1"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="@dimen/status_bar_height"
tools:text="Help Center Help Center Help Center "/>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabs_bar"
android:layout_
android:layout_
android:background="@color/transparent"
android:elevation="2dp"
android:textAlignment="center"
app:layout_constraintBottom_toTopOf="@id/guideline"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/toolbar_title"
app:layout_constraintVertical_bias="0.0"
app:tabBackground="@color/transparent"
app:tabIndicatorColor="@color/white"
app:tabSelectedTextColor="@color/white"
app:tabTextColor="@color/white_50_percent"/>
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager"
android:layout_
android:layout_
android:elevation="1dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/view_pager_guideline"
app:layout_constraintBottom_toBottomOf="parent"/>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_
android:layout_
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.35"/>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/view_pager_guideline"
android:layout_
android:layout_
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.18"/>
</androidx.constraintlayout.motion.widget.MotionLayout>
它使用以下运动场景:
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<Transition
app:constraintSetEnd="@layout/fragment_home_end"
app:constraintSetStart="@layout/fragment_home"
app:duration="500">
<OnSwipe
app:dragDirection="dragUp"
app:touchAnchorId="@id/view_pager"
app:touchAnchorSide="top"/>
<KeyFrameSet>
<KeyAttribute
android:elevation="0dp"
app:framePosition="0"
app:target="@id/header"/>
<KeyAttribute
android:elevation="0dp"
app:framePosition="90"
app:target="@id/header"/>
<KeyAttribute
android:elevation="@dimen/schedule_header_elevation_collapsed"
app:framePosition="100"
app:target="@id/header"/>
<KeyAttribute
android:elevation="0dp"
app:framePosition="0"
app:target="@id/toolbar"/>
<KeyAttribute
android:elevation="0dp"
app:framePosition="90"
app:target="@id/toolbar"/>
<KeyAttribute
android:elevation="@dimen/schedule_header_elevation_collapsed"
app:framePosition="100"
app:target="@id/toolbar"/>
<KeyAttribute
android:elevation="0dp"
app:framePosition="0"
app:target="@id/tabs_bar"/>
<KeyAttribute
android:elevation="0dp"
app:framePosition="90"
app:target="@id/tabs_bar"/>
<KeyAttribute
android:elevation="@dimen/schedule_header_elevation_collapsed"
app:framePosition="100"
app:target="@id/tabs_bar"/>
<KeyAttribute
android:alpha="1"
app:framePosition="0"
app:target="@id/toolbar_title"/>
<KeyAttribute
android:alpha="0"
app:framePosition="100"
app:target="@id/toolbar_title"/>
</KeyFrameSet>
</Transition>
</MotionScene>
知道如何解决这个问题吗?或者至少改进一下?
【问题讨论】:
【参考方案1】:将 nestadscrollingenabled = false 赋予 xml 中的水平回收视图
【讨论】:
我已经尝试过了,不幸的是它没有任何区别:( 完美运行,谢谢!!【参考方案2】:你可以试试这个组件 https://gist.github.com/Veeyikpong/aec06cfaf66dfcad427a47654953cd7d
示例用法
只需将此组件用作 XML 中的常规回收视图,如下所示:
<com.veeyikpong.utils.NestedHorizontalRecyclerView
android:id="@+id/recyclerView"
android:orientation="horizontal"
android:layout_
android:layout_height="wrap_content />
你可以走了! 如果可行,请标记为答案:)
【讨论】:
以上是关于水平和垂直回收器视图中的滚动问题的主要内容,如果未能解决你的问题,请参考以下文章
Vertical RecyclerView 中的 Horizontal RecyclerViews 丢失位置/状态
在尝试长时间无法在水平和垂直的回收器视图内的 2 个卡片视图元素之间提供空间 [重复]
UIScrollView 子视图中的水平 UISwipeGestureRecognizer ? (UIScrollView 只需要识别垂直滚动)