[解決済み] RecyclerView + AppBarLayoutでフライングする
質問
私はAppBarLayoutとCollapsingToolbarLayoutと新しいCoordinatorLayoutを使用しています。AppBarLayoutの下に、私はコンテンツのリストを持つRecyclerViewを持っています。
RecyclerViewでリストを上下にスクロールする際に、フリングスクロールが動作することを確認しました。しかし、拡張時にAppBarLayoutもスムーズにスクロールさせたいと思っています。
CollaspingToolbarLayoutを展開するために上にスクロールするとき、画面から指を離すとすぐにスクロールが停止してしまいます。素早い動きで上にスクロールすると、CollapsingToolbarLayoutも再縮小することがあります。RecyclerViewでのこの動作は、NestedScrollViewを使用した場合とは、かなり異なる機能であるように思われます。
recyclerviewにいろいろなスクロールプロパティを設定してみましたが、これといった解決策がありません。
スクロールの問題の一部を動画で紹介します。 https://youtu.be/xMLKoJOsTAM
以下は、RecyclerView(CheeseDetailActivity)の問題を示す例です。 https://github.com/tylerjroach/cheesesquare
Chris Banes氏のNestedScrollViewを使用したオリジナル例です。 https://github.com/chrisbanes/cheesesquare
解決方法は?
の答えは キリル・ボヤルシノフ はほぼ正解でした。
主な問題は、RecyclerViewが時々間違った方向を示すことです。彼の答えに次のコードを追加すると、正しく動作します。
public final class FlingBehavior extends AppBarLayout.Behavior {
private static final int TOP_CHILD_FLING_THRESHOLD = 3;
private boolean isPositive;
public FlingBehavior() {
}
public FlingBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onNestedFling(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, float velocityX, float velocityY, boolean consumed) {
if (velocityY > 0 && !isPositive || velocityY < 0 && isPositive) {
velocityY = velocityY * -1;
}
if (target instanceof RecyclerView && velocityY < 0) {
final RecyclerView recyclerView = (RecyclerView) target;
final View firstChild = recyclerView.getChildAt(0);
final int childAdapterPosition = recyclerView.getChildAdapterPosition(firstChild);
consumed = childAdapterPosition > TOP_CHILD_FLING_THRESHOLD;
}
return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed);
}
@Override
public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed) {
super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
isPositive = dy > 0;
}
}
お役に立てれば幸いです。
関連
-
[解決済み】このアクティビティでは、Theme.AppCompatテーマ(またはその子孫)を使用する必要があります。
-
java.lang.NullPointerException: NULLオブジェクト参照で仮想メソッド......を呼び出そうとしました。
-
aapt2エラー:ログを確認する(具体的な原因の探り方)
-
Android studioのインストールと問題発生、Emulator: PANIC: AVDのシステムパスが見つかりません。
-
android studioが "The activity must be exported or contain an intent-filter" と表示され実行される。
-
android exception - aapt.exe has stopped working.
-
Androidカスタムドロップダウンリストボックスコントロール
-
Android Studio http://schemas.android.com/apk/res/android 「URIが登録されていません」の解決方法について
-
android studioが新しいプロジェクトを作成しますが、プロジェクトの同期に成功するまでデザインエディタが使用できません。
-
Android.support.v7.widget.Toolbar が見つかりませんでした。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
プログラム "git.exe "を実行できない場合の正しい解決方法です。CreateProcessエラー=2
-
エラーが発生しました。ArrayAdapter は、リソース ID が TextView である必要があります。
-
Android開発で「Attempt to invoke virtual method 'XXX()' on null object reference」というヌルポインター例外に遭遇する。
-
エラー:未宣言の識別子(AS)の使用
-
Androidで、onTouchEventでダブルクリックを実装し、ダブルクリックイベントとして判定する方法
-
アンドロイドのエリプサイズを使用する
-
Androidの美しいSeekBarスタイルのカスタマイズ
-
アンドロイドリストビュー
-
android studioが新しいプロジェクトを作成しますが、プロジェクトの同期に成功するまでデザインエディタが使用できません。
-
Android TextViewは、テキスト内容が表示省略記号を超えているかどうかを判断する