6

使用设计支持库 22.2.1,具有以下视图层次结构:

<DrawerLayout
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:fitsSystemWindows="true">
    <CoordinatorLayout
     android:layout_width="match_parent"
     android:layout_height="match_parent">
        <AppBarLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
            <Toolbar
             android:layout_width="match_parent"
             android:layout_height="?attr/actionBarSize" />
            <TabLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:clipToPadding="false"
             app:tabGravity="fill"
             app:tabMode="scrollable" />
        </AppBarLayout>
        <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior">

            <!-- Fragments replaced here -->
            <LinearLayout
             android:orientation="vertical"
             android:layout_width="match_parent"
             android:layout_height="match_parent">
                <CustomDashboardView
                 android:layout_width="match_parent"
                 android:layout_height="120dp" />
                <ViewPager
                 android:layout_width="match_parent"
                 android:layout_height="match_parent">

                    <!-- Tab Fragments go here -->
                    <LinearLayout
                     android:orientation="vertical"
                     android:layout_width="match_parent"
                     android:layout_height="match_parent">
                        <CustomEmptyErrorLayout
                         android:layout_width="match_parent"
                         android:layout_height="match_parent"
                         android:visibility="gone" />
                        <android.support.v7.widget.RecyclerView
                         android:layout_width="match_parent"
                         android:layout_height="match_parent" />
                    </LinearLayout>

                </ViewPager>
            </LinearLayout>

        </FrameLayout>
    </CoordinatorLayout>
    <NavigationView
     android:layout_height="match_parent"
     android:layout_width="wrap_content"
     android:fitsSystemWindows="true" />
</DrawerLayout>

我遇到了这个问题,RecyclerView 的高度大于它应该包含的可见区域,所以看起来 RecyclerView 正在屏幕外绘制,并且不可能将 RecyclerView 中的最后一项滚动到完整视图中。Toolbar 和 TabLayout 也没有任何移动(尽管将 layout_behaviour 应用于 FrameLayout)。

突出显示问题的带注释的屏幕截图

我曾将此报告为一个错误,但 ol' Banesy 表示这是按预期工作的。如果是这种情况,我该如何避免这种预期的行为,而支持 RecyclerView 尊重 layout_height="match_parent" 并在可见屏幕内绘制其项目?https://code.google.com/p/android/issues/detail?id=182391

更新:现在有了 Design Support v23,它看起来一点也不好看。我已将其缩小到设计支持库本身(即更新 RecyclerView、appcompat 等到 v23,同时保留设计支持 v22.2.1 会产生与上述相同的问题)。所以新的外观,CustomDashboardLayout 和 RecyclerView 已经离开了,希望这也没有按预期工作:

在此处输入图像描述

4

2 回答 2

6

我已经设法在 v23 上解决了这个问题,并找到了 v22.2.1 的解决方法。版本之间的行为完全不同的事实使我相信“​​按预期工作”并不是全部事实。

v23 修复:ViewPager 上方的 CustomDashboardLayout 导致了问题,当它没有被强制为 visibility="gone" 时,ViewPager 根本没有被添加到层次结构中。随着它的消失,添加了 ViewPager 并且 RecyclerView 正确调整了它的高度。

v22.2.1 解决方法:v23 修复对 v22.2.1 没有影响,解决方法是在 RecyclerView 上设置 layout_marginBottom="?attr/actionBarSize"。

很高兴无论如何都结束了。

于 2015-08-24T00:19:20.167 回答
0

即使今天使用此视图层次结构的 api 级别 26,我也遇到了同样的问题 -

<android.support.design.widget.CoordinatorLayout>
   <android.support.design.widget.AppBarLayout>
      <android.support.design.widget.CollapsingToolbarLayout>
         <FrameLayout>
            <android.support.v4.view.ViewPager/>
            <TextView/>
         </FrameLayout>
         <android.support.v7.widget.Toolbar>
            <TextView/>
         </android.support.v7.widget.Toolbar>
      </android.support.design.widget.CollapsingToolbarLayout>
   </android.support.design.widget.AppBarLayout>
   <android.support.v7.widget.RecyclerView/>
</android.support.design.widget.CoordinatorLayout>

花了一整天后,我觉得不知何故RecyclerView无法计算出合适的高度。ViewPager我得出了这个结论,因为当我滑动RecyclerView正确显示最后一项时。所以我在活动中添加了一个ViewTreeObserverViewPager要求RecyclerView重绘自己。这解决了我的问题。

 val obs = pager?.viewTreeObserver
            obs?.addOnGlobalLayoutListener {
                recyclerView?.requestLayout()
                recyclerView?.invalidate()
            }
于 2017-10-30T14:42:12.607 回答