2

既存のリサイクラー ビューのアニメーションで簡単なスライドを作成しようとしています。

リサイクラーが 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();
    }

} 
4

1 に答える 1

0

recyclerView.destroyDrawingCache(); notifyDatasetChaged() が問題を解決する前に。

于 2015-10-20T18:38:12.193 に答える