【发布时间】:2014-09-02 03:55:39
【问题描述】:
我正在尝试使用新的RecyclerView 的ItemAnimator 来使用与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