2016-06-17 51 views
0

按照Building a RecyclerView LayoutManager article我已经创造了RecyclerView自己的自定义布局管理器,但由于可用的几个文件,我不能找到一种方法来强制回收视图从布局管理器内重建动画(就像使用notifyItemInserted或notifyItemDeleted时的动画)。这些动画由recyclerView及其项目动画师控制,开发者只能控制物品的位置。 所以我有一个方法fill,它根据当前滚动位置和布局管理器的状态执行放置子视图。这样的方法从两个地方被调用,回收站的观点自定义布局管理动画

  • 在onLayoutChildren(当布局管理器执行的项目初始化放置或当数据集被改变了这种方法被称为)

    @Override 
    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { 
        detachAndScrapAttachedViews(recycler); 
        fill(recycler); 
    } 
    
  • 在scrollVerticallyBy

    /** calculate offset of views while scrolling, layout items on new places*/ 
    @Override 
    public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) { 
        dy = scrollVerticallyInternal(dy); 
        offsetChildrenVertical(-dy); 
        if (condition) { 
         //todo refactor it, blinking now without animation. 
         detachAndScrapAttachedViews(recycler); 
        } 
    
        fill(recycler); 
        return dy; 
    } 
    

而且我想在遇到一些condition对某些视图和动画执行更复杂的转换。
它可能以某种方式是否开始布点儿童流动,到达时onLayoutChildren方法将被RecyclerView被调用。
我能够与detachAndScrapAttachedViews(recycler)做到这一点,并发起onLayoutChildren和运行默认fill的过程,但这种转变将立即没有任何动画进行。

是否有可能迫使recyclerView(或布局管理器)内从布局管理器来运行其动画?

+0

downvote的原因是什么?请在这种情况下发表评论家伙 – Beloo

回答

0

我已经调查的RecyclerView源,发现onLayoutChildren是当RecyclerView执行自己的布点过程调用。所以呼叫requestLayout应该是一个选项,而不是detachAndScrapAttachedViews。并结合requestSimpleAnimationsInNextLayout它应该有所帮助。但不是。如果里面postOnAnimation可运行已进行
这些行动只会工作。所以,至少,我的完成scrollVerticalBy我的布局管理器已成功运行动画:

@Override 
public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) { 
    dy = scrollVerticallyInternal(dy); 
    offsetChildrenVertical(-dy); 
    postOnAnimation(new Runnable() { 
     @Override 
     public void run() { 
      requestLayout(); 
      requestSimpleAnimationsInNextLayout(); 
     } 
    }); 

    fill(recycler); 
    return dy; 
} 
1

当我们实现了自定义布局管理,我们也提出我们自己的动画ExpandLayoutManager。特别是,我们使用了ValueAnimator来动画化LayoutManager外观的变化。如果您对我们的ExpandLayoutManager感兴趣,可在GitHub上找到。

在这里你还可以找到一些有价值的信息用于创建自定义布局管理:http://cases.azoft.com/create-custom-layoutmanager-android/