Android CoordinatorLayout:工具栏仅在列表开始滚动时滚动
Android CoordinatorLayout : ToolBar scroll only when list starts scrolling
我在我的应用程序中使用工具栏并使用这个 link 我隐藏工具栏,当列表只有一个/两个项目时,它与 expected.But 一样完美,没有必要滚动工具栏,因为底部有足够的 space。
隐藏工具栏背后的想法是利用工具栏 space 当列表项超出屏幕时 height.But 当列表项很少即小于设备屏幕高度时我做的不想滚动工具 bar.How 我能做到吗? 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>
最后这个逻辑对我有用。
1.Get recycleview 列表项的高度并乘以总项数。
- 获取显示器的高度。
根据以上两个参数将滚动标志设置为工具栏,如下代码:
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);
}
您忘记检查工具栏高度(您需要将此指标添加到列表高度)并在 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);
}
我在我的应用程序中使用工具栏并使用这个 link 我隐藏工具栏,当列表只有一个/两个项目时,它与 expected.But 一样完美,没有必要滚动工具栏,因为底部有足够的 space。
隐藏工具栏背后的想法是利用工具栏 space 当列表项超出屏幕时 height.But 当列表项很少即小于设备屏幕高度时我做的不想滚动工具 bar.How 我能做到吗? 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>
最后这个逻辑对我有用。
1.Get recycleview 列表项的高度并乘以总项数。
- 获取显示器的高度。
根据以上两个参数将滚动标志设置为工具栏,如下代码:
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);
}
您忘记检查工具栏高度(您需要将此指标添加到列表高度)并在 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);
}