「appbar_scrolling_view_behavior」を含むメインコンテナには実際にスクロールするのに十分なコンテンツがありませんが、AppBarLayoutのツールバーがスクロール可能であることは本当に意図されていますか?
これまでにテストしたこと:
NestedScrollView (「wrap_content」属性付き) をメイン コンテナーとして使用し、TextView を子として使用すると、AppBarLayout は正しく機能し、スクロールしません。
ただし、少数のエントリと「wrap_content」属性のみで RecyclerView を使用すると (スクロールする必要がないように)、RecyclerView がスクロール イベントを受信しなくても (OnScrollChangeListener でテスト)、AppBarLayout のツールバーはスクロール可能です。 )。
ここに私のレイアウトコードがあります:
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:theme="@style/ToolbarStyle" />
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
必要ではありませんが、ツールバーがスクロール可能であるという次の効果があります。
また、すべての RecyclerView アイテムが表示されているかどうかを確認し、RecyclerView の setNestedScrollingEnabled() メソッドを使用して、これに対処する方法も見つけました。
それにもかかわらず、それは私が意図したバグのように思えます。ご意見はありますか?:D
編集#1:
私の現在のソリューションに興味があるかもしれない人のために、メソッドを呼び出して調べるときに常に -1 を返す LayoutManager のために、ハンドラーの postDelayed() メソッドに setNestedScrollingEnabled() ロジックを 5 ミリ秒の遅延で配置する必要がありました。最初と最後の項目が表示されるかどうか。
このコードを onStart() メソッドで (RecyclerView が初期化された後) 使用し、RecyclerView のコンテンツの変更が発生するたびに使用します。
final LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//no items in the RecyclerView
if (mRecyclerView.getAdapter().getItemCount() == 0)
mRecyclerView.setNestedScrollingEnabled(false);
//if the first and the last item is visible
else if (layoutManager.findFirstCompletelyVisibleItemPosition() == 0
&& layoutManager.findLastCompletelyVisibleItemPosition() == mRecyclerView.getAdapter().getItemCount() - 1)
mRecyclerView.setNestedScrollingEnabled(false);
else
mRecyclerView.setNestedScrollingEnabled(true);
}
}, 5);
編集#2:
新しいアプリをいじってみましたが、この (意図しない) 動作は、サポート ライブラリ バージョン 23.3.0 (またはそれ以前) で修正されているようです。したがって、回避策はもう必要ありません。