RecyclerViewの最新の更新により、 NestedScrollView 内で wrap_content を実行できるようになりました。ただし、私には合わない動作がいくつかあり、答えを探しています。
問題点 1:ラッピングで空白が考慮されない。これは、RecyclerView コンテンツの後に空のスペースがある場合、ドラッグ アニメーションによって、次に示すように画面の中央で項目がクリップされることを意味します。
UPDATE : 問題 1 を解決しました。RecyclerView に layout_weight="1" 属性を追加する必要がありました。
問題 2:問題 1 と同様に、アイテムを削除すると、RecyclerView がアニメーションの開始時にすぐに折り返され、アニメーションが次のようにクリップされます。
更新: 問題 2 はまだ解決されていませんが、以前ほど目立たなくなりました。アイテムが削除されると、アイテムがビュー ポートにクリップされ、アニメーションがビュー ポートの下から引き上げられて、画面が新しい高さにジャンプするように見えます。
問題 3:新しいアイテムを追加するときに、ScrollView の最後までスクロールしたい。ただし、追加イベントで次のコードを実行すると、スクロールはすぐにスクロールビューの現在の末尾にジャンプします。「アイテムが挿入された後」のコールバックはありますか?
public void addItem(T item) {
items.add(item);
notifyItemInserted(items.size() - 1);
scroll.fullScroll(View.FOCUS_DOWN)
}
更新: 問題 3 はまだ解決されていませんが、次のように順序を逆にする回避策を見つけました。
layoutManager.setReverseLayout(true);
layoutManager.setStackFromEnd(true);
そして、新しいアイテムを追加するときの以下のコード。このように、スクロールは高さに関係なく常に機能します。
nestedScrollView.fullScroll(View.FOCUS_UP);
引用した記事:
RecyclerView はその子をアニメーション化しますが、それ自体の境界の変更をアニメーション化しないことに注意してください。RecyclerView の境界が変化するときにアニメーション化する場合は、Transition API を使用できます。
境界をアニメーション化する必要はありませんが、スナップしてビューポートを埋める必要があります (この場合、リサイクラービューの上にいくつかの静的ビューがあるため、match_parent を使用できません)。したがって、問題1を解決します。
境界が変更される前に何かをしたい。例: on remove item 削除をアニメーション化してから、バインドされた変更を適用します。したがって、問題 2を解決します。
逆に、境界がすでに変更されているときにいくつかのことをしたいと思います。例: 新しいアイテムを追加すると、最初に新しい境界が適用され、次にスクロール アニメーションが開始されます。したがって、問題 3を解決します。
どうすればこれを達成できますか?