我試圖使用新的RecyclerView
的ItemAnimator
來使用與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移動文檔,我相信我實現了所有必要的方法,並做了適當的電話,所以我沒有看到錯誤可能是什麼。
我有同樣的問題。我通過在onAnimationEnd中添加clearAnimation()來部分修復它,但是當兩個或更多動畫同時發生時,我會崩潰。 '@Override public void onAnimationEnd(動畫動畫) { viewHolder.itemView.clearAnimation(); mRunningRemovals.remove(viewHolder); dispatchRemoveFinished(viewHolder); }' – slamnjam