Android L 中的 RecyclerView ItemAnimator 故障
Posted
技术标签:
【中文标题】Android L 中的 RecyclerView ItemAnimator 故障【英文标题】:RecyclerView ItemAnimator glitch in Android L 【发布时间】:2014-09-02 03:55:39 【问题描述】:我正在尝试使用新的RecyclerView
的ItemAnimator
来使用与DefaultItemAnimator
不同的动画来移除项目。默认的效果很好,但是当我使用我的时,已删除的项目在RecyclerView
s 背景中保持“印记”,并且动画和其他项目只是在其上绘制。
这是我覆盖的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?