我正在尝试使用 newRecyclerView
来ItemAnimator
使用与删除项目不同的动画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 文档,我相信我实现了所有必要的方法并进行了正确的调用,所以我看不出错误可能是什么。