Android L 中的 RecyclerView ItemAnimator 故障

Posted

技术标签:

【中文标题】Android L 中的 RecyclerView ItemAnimator 故障【英文标题】:RecyclerView ItemAnimator glitch in Android L 【发布时间】: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); ` 【参考方案1】:

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

【讨论】:

很抱歉我之前的评论说您的评论是另一个问题,我当时以为我在讨论关于动画的另一个问题。感谢您的意见,我暂时无法对其进行测试,但我会尽快通知您。 没问题,不清楚是否相关。希望这可以为您解决问题。

以上是关于Android L 中的 RecyclerView ItemAnimator 故障的主要内容,如果未能解决你的问题,请参考以下文章

如何导入 RecyclerView for Android L-preview

为啥 CardView 和 RecyclerView 需要 minSdkVersion L?

全屏 RecyclerView 图像滑块

关于Android RecyclerView的那些开源LayoutManager

多个 RecyclerView 不在同一个片段中工作

Android:RecyclerView 不显示片段中的列表项