在RecyclerView之后,使空视图占用剩余空间?

时间:2015-08-13 19:26:38

标签: android android-layout android-xml

我正在尝试制作一个有色的空视图占用RecyclerView之后的剩余空间。我查看了不同的StackOverflow解决方案,但没有任何效果。基本上我想要这样的东西:

________________________
|                       |
|                       |
|                       |
|    Recycler view      |
|                       |
|  -------------------  |
|    colored empty view |
|                       |
|                       |
|                       |
|                       |
|                       |
_________________________

It should shrink as the RecyclerView grows. 

________________________
|                       |
|                       |
|                       |
|    Recycler view      |
|                       |
|                       |
|                       |
|                       |
|                       |
|  -------------------  |
|    colored empty view |
|                       |
|                       |
_________________________

但是,如果RecyclerView超过一个屏幕的价值,则应该没有空视图。这是我到目前为止所做的:

 <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fab="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/bla_bla_layout">


    <android.support.v7.widget.RecyclerView
        android:id="@+id/bla_bla_recyclerview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <View
        android:background="@color/grayBackground"
        android:layout_gravity="bottom"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <com.melnykov.fab.FloatingActionButton
        android:id="@+id/fab"
        android:contentDescription="@string/add_bla"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|right"
        android:layout_margin="16dp"
        android:src="@drawable/add_bla_icon"
        fab:fab_colorNormal="@color/primary"
        fab:fab_colorPressed="@color/primary_pressed"
        fab:fab_colorRipple="@color/ripple" />

</FrameLayout>

修改 这不是上述问题的重复,如果您同时阅读这两个问题,您可以看到这一点。我的问题的解决方案应该是纯xml,基于布局。 “空视图”是指现有RecyclerView下面的一些彩色矩形,而不是当RecylerView中没有数据时实际上显示“空视图”的文本视图。

4 个答案:

答案 0 :(得分:6)

Recycler视图在运行时计算其高度,我们使用LinearLayoutManager指定其高度和宽度。

但问题是,现在LinearLayoutManager不支持wrap_content,它总是使用match_parent来表示它的高度。

所以你必须使用这个LinearLayoutManager而不是android.support.v7.widget.LinearLayoutManager。

复制包中的java类并使用它,如下所示,

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,
            LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(linearLayoutManager);
// if it has fixed size
recyclerView.setHasFixedSize(true);

我测试了它,并根据需要进行了测试。

答案 1 :(得分:0)

看起来你可以使用RelativeLayout使用一些对齐命令来完成。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"/>

        <View
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/recycler_view"
            android:layout_alignParentBottom="true"
            android:background="@color/blue"/>

    </RelativeLayout>

</FrameLayout>

我添加了FrameLayout,因为您在另一条评论中提到您需要将它与FAB一起使用。

如果您将其加载到AndroidStudio中并开始为RecyclerView的高度设置样本宽度(50dp,150dp,300dp ...),您将看到它下面的View开始调整其高度同样。

答案 2 :(得分:0)

如果您只想在剩余空间中使用其他颜色,请将function populateFormula() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var activeSheetName = ss.getActiveSheet().getName(); var sheets = ss.getSheets(); var ranges = []; sheets.forEach(function(e) { var sheetName = e.getName(); if (sheetName != activeSheetName) ranges.push("'" + sheetName + "'!A16:D"); }); if (ranges.length) ss.getActiveRange().setFormula("={" + ranges.join(";") + "}"); } 的背景设置为所需的颜色,然后设置FrameLayout项目RecyclerView背景到白色。

这将导致剩余空间为单独的颜色,layout中填充项目的长度将根据您的需要为白色。

如果您想在剩余空间中使用其他视图,例如textView或ImageView,我猜您必须扩展recyclerViewRecyclerView class计算其高度的方法。

答案 3 :(得分:0)

使用自定义LinearLayoutManager希望它可以解决您的问题。

在您的活动中使用此代码

 RecycleView rv= (RecyclerView) rootView.findViewById(R.id.recycler_view);
   CustomLinearLayoutManager lm= new CustomLinearLayoutManager(mActivity);
    lm.setOrientation(LinearLayoutManager.VERTICAL);
    lm.setHasFixedSize(true);
    rv.setLayoutManager(lm);

这是我的CustomLinearLayoutManager

public class CustomLinearLayoutManager extends LinearLayoutManager {

public CustomLinearLayoutManager(Context context) {
    super(context);
}

private int[] mMeasuredDimension = new int[2];

@Override
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
                      int widthSpec, int heightSpec) {
    final int widthMode = View.MeasureSpec.getMode(widthSpec);
    final int heightMode = View.MeasureSpec.getMode(heightSpec);
    final int widthSize = View.MeasureSpec.getSize(widthSpec);
    final int heightSize = View.MeasureSpec.getSize(heightSpec);

    measureScrapChild(recycler, 0,
            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
            mMeasuredDimension);

    int width = mMeasuredDimension[0];
    int height = mMeasuredDimension[1];

    switch (widthMode) {
        case View.MeasureSpec.EXACTLY:
        case View.MeasureSpec.AT_MOST:
            width = widthSize;
            break;
        case View.MeasureSpec.UNSPECIFIED:
    }

    switch (heightMode) {
        case View.MeasureSpec.EXACTLY:
        case View.MeasureSpec.AT_MOST:
            height = heightSize;
            break;
        case View.MeasureSpec.UNSPECIFIED:
    }

    setMeasuredDimension(width, height);
}

private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
                               int heightSpec, int[] measuredDimension) {
    try {
        View view = recycler.getViewForPosition(position);
        if (view != null) {
            RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
            int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec,
                    getPaddingLeft() + getPaddingRight(), p.width);
            int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,
                    getPaddingTop() + getPaddingBottom(), p.height);
            view.measure(childWidthSpec, childHeightSpec);
            measuredDimension[0] = view.getMeasuredWidth();
            measuredDimension[1] = view.getMeasuredHeight();
            recycler.recycleView(view);
        }
    }catch(Exception e){
        e.printStackTrace();
    }
}

}