2

我在我的应用程序中使用工具栏并使用此链接隐藏工具栏,它按预期完美运行。但是当列表只有一个/两个项目时,无需滚动工具栏,因为在底部。

隐藏工具栏的想法是在列表项超出屏幕高度时利用工具栏空间。但是当列表项很少时,即小于设备屏幕高度时,我不想滚动工具栏。我该怎么做实现这一目标。TIA。

代码 :

<?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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.v7.widget.RecyclerView
    android:id="@+id/my_recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <include
        android:id="@+id/my_awesome_toolbar"
        layout="@layout/tool_bar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:layout_scrollFlags="scroll|enterAlways" />

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

<TextView
    android:id="@+id/empty_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="@string/no_matches_found"
    android:visibility="gone" />


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

2 回答 2

3

最后这个逻辑对我有用。

1.获取recycleview列表项的高度并乘以总项数。

  1. 获取显示器的高度。

基于以上两个参数设置滚动标志到工具栏,如下代码:

private void setScrollIfNeeded() {
    int viewItemHeight = getResources().getDimensionPixelSize(R.dimen.dp); // list item size is fixed in this case
    int totalCount = mRecycleView.getAdapter().getItemCount();

    DisplayMetrics displaymetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    int height = displaymetrics.heightPixels;
    int width = displaymetrics.widthPixels;

    int listHeight = viewItemHeight * totalCount;
    if (listHeight > height) {
        setScrollFlags(true);
    } else {
        setScrollFlags(false);
    }
}

public void setScrollFlags(boolean set) {
    AppBarLayout.LayoutParams params =
            (AppBarLayout.LayoutParams) mTooolbar.getLayoutParams();

    if (set)
        params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL
                | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);
    else

        params.setScrollFlags(0);
}
于 2015-10-04T15:15:04.543 回答
0

您忘记检查工具栏高度(您需要将此指标添加到列表高度)并在 setScrollFlags 方法中更新工具栏布局参数。

要计算工具栏高度,一种简单的方法是:

final TypedArray styledAttributes = context.getTheme().obtainStyledAttributes(new int[]{
      R.attr.actionBarSize});
int toolbarHeight = (int) styledAttributes.getDimension(0, 0);
styledAttributes.recycle();

要更新 lp,您需要在方法末尾添加此行。

mTooolbar.setLayoutParams(params);

完整代码:

private void setScrollIfNeeded() {
    int viewItemHeight = getResources().getDimensionPixelSize(R.dimen.dp); // list item size is fixed in this case
    int totalCount = mRecycleView.getAdapter().getItemCount();

    DisplayMetrics displaymetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    int height = displaymetrics.heightPixels;
    int width = displaymetrics.widthPixels;

    int listHeight = viewItemHeight * totalCount;

   final TypedArray styledAttributes = context.getTheme().obtainStyledAttributes(new int[]{
          R.attr.actionBarSize});
    int toolbarHeight = (int) styledAttributes.getDimension(0, 0);
    styledAttributes.recycle();

    listHeight += toolbarHeight;


    if (listHeight > height) {
        setScrollFlags(true);
    } else {
        setScrollFlags(false);
    }
}

public void setScrollFlags(boolean set) {
    AppBarLayout.LayoutParams params =
            (AppBarLayout.LayoutParams) mTooolbar.getLayoutParams();

    if (set){
        params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL
                | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);
    } else {
        params.setScrollFlags(0);
    }
    mTooolbar.setLayoutParams(params);
}
于 2016-01-19T11:43:06.227 回答