3

RecyclerView新しい を使用して、アイテムの削除ItemAnimatorとは異なるアニメーションを使用しようとしています。DefaultItemAnimatorデフォルトのものはうまく機能しますが、私のものを使用すると、削除されたアイテムがRecyclerView背景に「刻印」されたままになり、アニメーションやその他のアイテムがその上に描画されます。

ここに私のオーバーライドがありますItemAnimator:

public static class ItemAnimator extends RecyclerView.ItemAnimator
{
  private Activity mActivity;
  private final List<ViewHolder> mPendingRemovals = new ArrayList<ViewHolder>();
  private final List<ViewHolder> mRunningRemovals = new ArrayList<ViewHolder>();

  public ItemAnimator(Activity activity)
  {
    super();
    mActivity = activity;
  }

  @Override
  public void runPendingAnimations()
  {
    for (final ViewHolder viewHolder : mPendingRemovals)
    {
      Animation animation = AnimationUtils.loadAnimation(mActivity, android.R.anim.slide_out_right);
      animation.setAnimationListener(new Animation.AnimationListener()
      {
        @Override
        public void onAnimationStart(Animation animation) { }

        @Override
        public void onAnimationEnd(Animation animation)
        {
          mRunningRemovals.remove(viewHolder);
          dispatchRemoveFinished(viewHolder);
        }

        @Override
        public void onAnimationRepeat(Animation animation) { }
      });

      viewHolder.itemView.startAnimation(animation);

      mRunningRemovals.add(viewHolder);
    }

    mPendingRemovals.clear();
  }

  @Override
  public boolean animateRemove(RecyclerView.ViewHolder viewHolder)
  {
    mPendingRemovals.add((ViewHolder) viewHolder);
    return true;
  }

  @Override
  public boolean animateAdd(RecyclerView.ViewHolder viewHolder)
  {
    return false;
  }

  @Override
  public boolean animateMove(RecyclerView.ViewHolder viewHolder, int i, int i2, int i3, int i4) { return false; }

  @Override
  public void endAnimation(RecyclerView.ViewHolder viewHolder)
  {
    ((ViewHolder)viewHolder).itemView.clearAnimation();
    mRunningRemovals.remove(viewHolder);
  }

  @Override
  public void endAnimations()
  {
    for (ViewHolder viewHolder : mRunningRemovals)
      viewHolder.itemView.clearAnimation();

    mRunningRemovals.clear();
  }

  @Override
  public boolean isRunning()
  {
    return mRunningRemovals.size() > 0;
  }
}

Android L のドキュメントによると、必要なすべてのメソッドを実装し、適切な呼び出しを行ったと思われるため、エラーが何であるかはわかりません。

4

1 に答える 1

0

RecyclerView では、サポート ライブラリの ViewCompat.animate() を使用して、Animation クラスではなくビューをアニメーション化する必要があるようです。私も同じ問題を抱えていましたが、ViewCompat の使用に切り替えたところ、すべての不具合が解消されました。また、これは DefaultItemAnimator の Android ソース コードで行われる方法です。

于 2014-11-13T10:29:50.237 に答える