RecyclerView
には、複数のビュータイプがあり、それぞれ背景が異なるレンダリングがあります。当然ながら、私はこれらすべてのコンポーネントのオーバードローを避けたいので、RecyclerView
とすべてのビューを階層の中にバックグラウンドなしで表示します。RecyclerViewのレイアウトを過剰描画で最適化する
これは正常に動作します。アイテムのアニメーションを開始したり終了したりするまでです。 DefaultItemAnimator
はもちろん、素早くアイテムを出し入れするため、RecyclerView
の「穴」が開き、その背景がすぐに見えるようになります。
アニメーションが実際に実行されているときにRecyclerView
に背景のみを与え、それ以外の場合は背景を削除して、スクロールが高いFPSレートでスムーズに動作するようにしてみましょう。しかし、具体的な "アニメーションが始まりません"と対応する "アニメーションが終了する"という信号がRecyclerView
、ItemAnimator
または関連クラスに存在しないため、これは当初の考えよりも実際には難しくなります。
RecyclerView.ItemAnimator.ItemAnimatorFinishedListener finishListener =
new RecyclerView.ItemAnimator.ItemAnimatorFinishedListener() {
@Override
public void onAnimationsFinished() {
recycler.setBackgroundResource(0);
}
};
recycler.getAdapter().registerAdapterDataObserver(
new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
start();
}
@Override
public void onItemRangeRemoved(int positionStart, int itemCount) {
start();
}
@Override
public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
start();
}
private void start() {
recycler.setBackgroundResource(R.color.white);
if (!recycler.getItemAnimator().isRunning()) {
return;
}
recycler.getItemAnimator().isRunning(finishListener);
}
}
);
ここでの問題は、アダプタの範囲のコールバックは、実際のアニメーションを実行するより仕方早く走っているということである、なぜなら私が最近試した何
は成功せず、このようなItemAnimatorFinishedListener
でAdapterDataObserver
を組み合わせることでしたが、アニメーションはの内部で発生する前にスケジュールされません。つまり、start()
メソッドではrecycler.getItemAnimator().isRunning()
が常にfalse
を返します。そのため、背景は決して削除されません。
私はさらにViewTreeObserver.OnGlobalLayoutListener
を試してみる前に、それをミックスに持ち込むことができます。誰かがこの問題の解決策を見つけるのは簡単ですか?