在Bottomsheet打开后调整Recyclerview高度会导致项目之间出现间隙

时间:2018-06-13 08:30:15

标签: android android-recyclerview bottom-sheet

我在用户打开或关闭BottomSheet后调整RecyclerView高度,以便RecyclerView的高度位于ToolBar和我的BottomSheet之间。 问题是当高度发生变化时,向上或向下滚动会导致物品之间产生很大的差距 - 间隙实际上是一个宽度为0且高度更大的物品应该是这样的,这就是为什么它看起来像是一个间隙。 / p>

这是主要布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".RegisterActivity">

    <!-- includes the RecyclerView -->
    <include layout="@layout/activity_register_sheet_content" />

    <!-- includes the bottom sheet -->
    <include layout="@layout/register_bottom_sheet" />

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

和java:

    bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            ViewGroup.LayoutParams params = registerRecyclerView.getLayoutParams();

            if (newState == STATE_COLLAPSED) {
                params.height = originalRecyclerViewHeight;
                registerRecyclerView.setLayoutParams(params);

            } else if (newState == STATE_EXPANDED) {
                params.height = realRecyclerHeight - bottomSheet.getMeasuredHeightAndState();
                registerRecyclerView.setLayoutParams(params);
            }
        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {
        }
    });

我正在使用此版本的AppCompat:

implementation 'com.android.support:appcompat-v7:27.1.1'

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您需要使用浮点偏移量在重写的onSlide方法中调整高度。正如docs所说,浮动偏移是:

  

此底页的新偏移量在[-1,1]范围内。抵消   随着这个底部纸张向上移动而增加。从0到1表   在折叠状态和展开状态之间,从-1到0   在隐藏和崩溃的状态之间。

您可以通过

获取底部纸张高度的值
    int padding = bottomSheet.getHeight();

然后,您可以将其乘以浮动偏移量,以根据需要调整高度。 e.g。

int padding = bottomSheet.getHeight();

if (!Float.isNaN(slideOffset)) {
     padding *= (1 - Math.abs(slideOffset));            
}

然后使用该值设置回收者视图的高度。