3

我正在尝试使用 newRecyclerViewItemAnimator使用与删除项目不同的动画DefaultItemAnimator。默认的效果很好,但是当我使用我的时,被删除的项目在 s 背景中保持“印记”,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 回答