【问题标题】:RecyclerView ItemAnimator glitch in Android LAndroid L 中的 RecyclerView ItemAnimator 故障
【发布时间】:2014-09-02 03:55:39
【问题描述】:

我正在尝试使用新的RecyclerViewItemAnimator 来使用与DefaultItemAnimator 不同的动画来移除项目。默认的效果很好,但是当我使用我的时,已删除的项目在RecyclerViews 背景中保持“印记”,并且动画和其他项目只是在其上绘制。

这是我覆盖的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 文档,我相信我实现了所有必要的方法并进行了正确的调用,所以我看不出错误可能是什么。

【问题讨论】:

  • 我遇到了同样的问题。我通过在 onAnimationEnd 中添加 clearAnimation() 部分修复了它,但是当两个或多个动画同时发生时我会崩溃。 ` @Override public void onAnimationEnd(Animation animation) { viewHolder.itemView.clearAnimation(); mRunningRemovals.remove(viewHolder); dispatchRemoveFinished(viewHolder); }`

标签: android android-animation android-5.0-lollipop android-recyclerview


【解决方案1】:

看来,对于 RecyclerView,您必须使用支持库中的 ViewCompat.animate() 来为视图设置动画,而不是使用 Animation 类。我遇到了同样的问题,当我切换到使用 ViewCompat 时,所有的故障都消失了。此外,在 DefaultItemAnimator 的 Android 源代码中也是如此。

【讨论】:

  • 很抱歉我之前的评论说您的评论是另一个问题,我当时以为我在讨论关于动画的另一个问题。感谢您的意见,我暂时无法对其进行测试,但我会尽快通知您。
  • 没问题,不清楚是否相关。希望这可以为您解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多