RecyclerView预测项目动画不起作用(出现)

时间:2015-03-21 00:39:12

标签: android android-recyclerview gridlayoutmanager

我有一个带有GridLayoutManager的RecyclerView(支持lib v7)。我更新适配器并生成notifyItemMoved。如果项目源位置在屏幕上并且目标位置也在屏幕上 - "移动动画"玩过的。如果项目位于屏幕之外(位置1000或远离视口的任何其他位置)并移动到视口中,它将显示为"淡入动画"。

看起来预测项目动画不起作用,尽管supportPredictiveItemAnimations()返回true。难道我做错了什么?我应该覆盖一些方法来启用它吗?

我正在阅读RecyclerView的源代码,并在dispatchLayout方法的javadoc中写成:

  
      
  • 移动了PERSISTENT视图({@link ItemAnimator#animateMove(ViewHolder,int,int,int,int)})
  •   
  • 移除了REMOVED视图({@link ItemAnimator#animateRemove(ViewHolder)})
  •   
  • 添加了添加的视图({@link ItemAnimator#animateAdd(ViewHolder)})
  •   
  • DISAPPEARING视图移出屏幕
  •   
  • 在屏幕上移动外观视图
  •   

然而,ItemAnimator并没有区分ADDED和APPEARING。 是否有可能修复预测动画或者至少使APPEARING动画看起来像是从屏幕动画的外部移动"以原样方式提供ADDED动画?

2 个答案:

答案 0 :(得分:0)

您可以尝试覆盖getExtraLayoutSpace(RecyclerView.State state)的{​​{1}},为管理员提供预测动画的额外空间。

示例:

LinearLayoutManager

根据滚动视图的上一个滚动增量,将在开头或结尾添加额外的空格。您可以查看@Override protected int getExtraLayoutSpace(RecyclerView.State state) { return getHeight(); // add extra page for better predictive animations } onLayoutChildren的实施情况,了解更多详情。

答案 1 :(得分:0)

我有同样的问题。检查是否设置了ItemAnimator。 预测动画取决于此,因此,如果您要改用TransitionManager,请创建空的ItemAnimator来启用预测动画。

您可以检查源代码(LinearLayoutManager:组:“ com.android.support”,名称:“ recyclerview-v7”,版本:“ 27.0.2”)。

第700-703行:

if (!state.willRunPredictiveAnimations() ||  getChildCount() == 0 || state.isPreLayout()
            || !supportsPredictiveItemAnimations()) {
        return;
    }

state.willRunPredictiveAnimations()-如果ItemAnimator为null,则返回false。

EmptyItemAnimator.java

public class EmptyItemAnimator extends RecyclerView.ItemAnimator {
@Override
public boolean isRunning() {
    return false;
}

@Override
public void endAnimations() {}

@Override
public boolean animatePersistence(@NonNull RecyclerView.ViewHolder viewHolder, @NonNull ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) {
    return false;
}

@Override
public void endAnimation(RecyclerView.ViewHolder item) {}

@Override
public boolean animateChange(@NonNull RecyclerView.ViewHolder oldHolder, @NonNull RecyclerView.ViewHolder newHolder, @NonNull ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) {
    return false;
}

@Override
public void runPendingAnimations() {}

@Override
public boolean animateAppearance(@NonNull RecyclerView.ViewHolder viewHolder, @Nullable ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) {
    return false;
}

@Override
public boolean animateDisappearance(@NonNull RecyclerView.ViewHolder viewHolder, @NonNull ItemHolderInfo preLayoutInfo, @Nullable ItemHolderInfo postLayoutInfo) {
    return false;
}}

现在您可以尝试:

TransitionManager.beginDelayedTransition(recyclerView);
recyclerViewAdapter.notifyItem... //add, remove, change etc.