既存のリサイクラー ビューのアニメーションで簡単なスライドを作成しようとしています。
リサイクラーが 50 個のアイテムを保持していて、ある時点でデータセットが変更され、現在は 40 個のアイテムしか含まれておらず、アイテムが置き換えられ、以前の 50 個のアイテムはすべて関連性がなくなったとします。
そのため、データ構造が変更され、新しいアイテムがアニメーション化された後に、notifyDatasetChanged() が呼び出されます。
問題は、新しいアイテムの下に以前の 40 アイテムがまだ表示され、各セルの同じスペースに以前のデータと新しいデータの両方が表示されることです。
ItemAnimator サブクラスのコードは以下のとおりです。削除セルの不透明度を変更する削除アニメーションを追加すると、非表示になりますが、アイテムの装飾 (リスト行) がnot
削除されます。アイテムを完全に削除し、非表示にしないことをお勧めします。 .
public class RVSlideAnimation extends RecyclerView.ItemAnimator {
List<RecyclerView.ViewHolder> mViewHolders = new ArrayList<RecyclerView.ViewHolder>();
@Override
public void runPendingAnimations() {
if (!mViewHolders.isEmpty()) {
int animationDuration = 250;
AnimatorSet animator;
View target;
for (final RecyclerView.ViewHolder viewHolder : mViewHolders) {
target = viewHolder.itemView;
target.setPivotX(target.getMeasuredWidth() / 2);
target.setPivotY(target.getMeasuredHeight() / 2);
animator = new AnimatorSet();
animator.playTogether(
ObjectAnimator.ofFloat(target, "translationX", target.getMeasuredWidth(), 0.0f),
ObjectAnimator.ofFloat(target, "alpha", target.getAlpha(), 1.0f)
);
animator.setTarget(target);
animator.setDuration(animationDuration);
animator.setInterpolator(new AccelerateDecelerateInterpolator());
animator.setStartDelay((animationDuration * viewHolder.getAdapterPosition()) / 10);
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
mViewHolders.remove(viewHolder);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
animator.start();
}
}
}
@Override
public boolean animateRemove(RecyclerView.ViewHolder viewHolder) {
//viewHolder.itemView.animate().alpha(0).setDuration(100);
return false;
}
@Override
public boolean animateAdd(RecyclerView.ViewHolder viewHolder) {
viewHolder.itemView.setAlpha(0.0f);
return mViewHolders.add(viewHolder);
}
@Override
public boolean animateMove(RecyclerView.ViewHolder viewHolder, int i, int i2, int i3, int i4) {
return false;
}
@Override
public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromLeft, int fromTop, int toLeft, int toTop) {
return false;
}
@Override
public void endAnimation(RecyclerView.ViewHolder viewHolder) {
}
@Override
public void endAnimations() {
}
@Override
public boolean isRunning() {
return !mViewHolders.isEmpty();
}
}