CoordinatorLayout 中的 RelativeLayout 不滚动

Posted

技术标签:

【中文标题】CoordinatorLayout 中的 RelativeLayout 不滚动【英文标题】:RelativeLayout in CoordinatorLayout doesn't scroll 【发布时间】:2017-05-30 15:17:08 【问题描述】:

我的CoordinatorLayout 中有一个RelativeLayout(如下所示)。另请注意,在RelativeLayout 中我有一个RecyclerView

但是,当我滚动时,我只能在RecyclerView 上滚动,并且只有屏幕的RecyclerView 部分实际上会滚动。如果我尝试在RecyclerView 上方的布局上滚动,它根本不会滚动屏幕。这是我为正在发生的事情制作的插图:

所以我的问题是,为什么我不能在内部 RelativeLayout 上滚动?我应该以不同的方式组织布局吗?

这是我的布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer"
    android:layout_
    android:layout_
    tools:openDrawer="start">

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/main_content"
        android:layout_
        android:layout_>

        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_
            android:layout_
            android:theme="@style/AppTheme.AppBarOverlay">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_
                android:layout_
                android:background="?attr/colorPrimary"
                app:layout_scrollFlags="scroll|enterAlways"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

        </android.support.design.widget.AppBarLayout>

        <RelativeLayout
            android:layout_
            android:layout_
            android:orientation="vertical"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <RelativeLayout
                android:id="@+id/header"
                android:layout_
                android:layout_>

                // some imageviews and textviews

            </RelativeLayout>

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view"
                android:scrollbars="vertical"
                android:layout_
                android:layout_
                android:layout_below="@+id/header" />

        </RelativeLayout>

        <android.support.design.widget.FloatingActionButton
            android:id="@+id/fab"
            android:layout_
            android:layout_
            android:layout_gravity="bottom|end"
            android:layout_margin="@dimen/fab_margin" />

    </android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_
        android:layout_
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_drawer"
        app:menu="@menu/menu_navigation_drawer" />

</android.support.v4.widget.DrawerLayout>

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

RelativeLayout 如果不在任何可滚动视图中,则它是不可滚动的。 尝试将您的RelativeLayout 作为RecyclerView 的标题。

在此示例中,您将能够滚动其内容

<ScrollView 
     ...
     ...>
         <!-- Scrollable Contents -->
</ScrollView>

在您的情况下,我认为最好的方法是让您的 RecyclerView 占据整个屏幕,然后分配其标题。关注此link 或this。有很多,所以用谷歌搜索吧

【讨论】:

【参考方案2】:

好的,这可以使用单个recyclerview 并将您的标题relativelayout 作为recyclerview 的一个项目来完成。

请大家熟悉getItemViewType方法,用来决定recyclerview item的item type。

将数据添加到您的dataset,您将使用它来决定项目的类型。考虑下面的例子......

    public class MyRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> 

    private final int ITEM_ROW = 1;
    private final int ITEM_HEADER = 2;

    // Will be your dataset which will be containing first item as relativeLayout payload.
    private ArrayList<Object> mData;

    public MyRecyclerViewAdapter(ArrayList<Object> mData) 
        this.mData = mData;
    

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
        RecyclerView.ViewHolder vh = null;
        if (viewType == ITEM_ROW) 
            // Inflate your row item of recyclerview here...

            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_checkout_review_cart_item, parent, false);
            vh = new ItemHolder(view);
         else if (viewType == ITEM_HEADER) 

            // Inflate your relativeLayout here...

            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_order_detail_grand_total_item, parent, false);
            vh = new RelativeLayoutHolder(view);
        
        return vh;
    

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) 
        if (holder instanceof ItemHolder) 

            // Bind item of recyclerview here...

         else if (holder instanceof RelativeLayoutHolder) 

            // Bind data of your relativeLayout

        
    

    @Override
    public int getItemCount() 
        return mData.size();
    

    @Override
    public int getItemViewType(int position) 
        // Decide type of an item using payload instances..
        Object obj = mData.get(position);
        if (obj instanceof ItemInfo) 
            return ITEM_ROW;
         else if (obj instanceof RelativeLayoutInfo) 
            return ITEM_HEADER;
         else 
            return -1;
        
    

    class ItemHolder extends RecyclerView.ViewHolder 

        ItemHolder(View itemView) 
            super(itemView);
        
    

    class RelativeLayoutHolder extends RecyclerView.ViewHolder 

        RelativeLayoutHolder(View itemView) 
            super(itemView);
        
    

您的Payload of dataset 将决定 itemType。两种类型的Pojo 将被插入到您的dataset - RelativeLayoutInfoItemInfo 中。举个例子

public class ItemInfo implements Serializable 

     // Consider adding object and getter setter here

public class RelativeLayoutInfo implements Serializable 

   // Consider adding object and getter setter here

给你。您的relativeLayout 被添加为recyclerview 的项目。 编码愉快!

【讨论】:

以上是关于CoordinatorLayout 中的 RelativeLayout 不滚动的主要内容,如果未能解决你的问题,请参考以下文章

coordinatorlayout 中的重叠视图

滚动时单击不在 CoordinatorLayout 中的 RecyclerView 上工作

将应用栏滚动视图行为添加到 CoordinatorLayout 中的多个视图

ListView 与 CoordinatorLayout 中的 SearchView 重叠

如何用CollapsingToolbar替换CoordinatorLayout中的CardView?

在 CoordinatorLayout Android 中的 ViewPager 片段中使用 NestedScrollView 突然滚动