3

我試圖使用新的RecyclerViewItemAnimator來使用與DefaultItemAnimator不同的動畫來刪除項目。默認的效果很好,但是當我使用我的時候,被刪除的項目在RecyclerView的背景中保留「印記」,並且動畫和其他項目只是在它上面繪製。Android中的RecyclerView ItemAnimator故障

這裏是我重寫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移動文檔,我相信我實現了所有必要的方法,並做了適當的電話,所以我沒有看到錯誤可能是什麼。

+0

我有同樣的問題。我通過在onAnimationEnd中添加clearAnimation()來部分修復它,但是當兩個或更多動畫同時發生時,我會崩潰。 '@Override public void onAnimationEnd(動畫動畫) { viewHolder.itemView.clearAnimation(); mRunningRemovals.remove(viewHolder); dispatchRemoveFinished(viewHolder); }' – slamnjam

回答

0

看起來,使用RecyclerView,您必須使用支持庫中的ViewCompat.animate()來爲Animation類而不是Animation類創建動畫。我遇到了同樣的問題,當我切換到使用ViewCompat時,所有的毛刺都消失了。另外,這是在DefaultItemAnimator的Android源代碼中完成的。

+0

對不起,我以前的評論說你的評論是另一個問題,我以爲我當時是在關於動畫的另一個問題。感謝您的輸入,目前我無法測試,但我會盡快通知您。 – Jukurrpa

+0

沒問題,不清楚它是否相關。希望這能爲你解決它。 – slamnjam