2016-07-29 77 views
0

我有一个布局,有几个cardView,其中有recyclerViews在他们 在开始第一个recyclerview是空的,所以卡不显示。getHeight返回0里面onPreDrawListenter

后来,recyclerview被填充,所以我希望它有一个很好的动画。 我试图将其他卡片向下移动,然后淡入卡片中。

要做到这一点,我设置了recyclerView的数据库,然后附加一个OnPreDrawListener到它周围的卡式视图,这样我就可以获得视图的高度,然后将视图设置为GONE并在其上运行一个动画动画它下面的卡片。

事情是,当我打电话给getMeasuredHeight时,我得到0. 它几乎和notifyDatasetChanged()只发生在下一帧中一样,所以视图并没有得到它的新高度。

这里是我的代码:

private void runSearchAnimation(List<Route> searchResult) { 
    if(rvSearchResults.getMeasuredHeight() == 0) { 
     Log.i(TAG, "height is 0"); 

     resultsAdapter.setDatabase(searchResult); 

     cvSearchResults.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
      @Override 
      public boolean onPreDraw() { 
       cvSearchResults.getViewTreeObserver().removeOnPreDrawListener(this); 

       Log.i(TAG, "cvSearchResults.getMeasuredHeight() = " + cvSearchResults.getMeasuredHeight()); 
       cvSearchResults.setVisibility(View.GONE); 

       ObjectAnimator contentAnim = ObjectAnimator.ofFloat(cvRecentSearches, 
         "translationY", cvRecentSearches.getTranslationY(), cvSearchResults.getMeasuredHeight()); 

       contentAnim.addListener(new AnimatorListenerAdapter() { 
        @Override 
        public void onAnimationStart(Animator animation) { 
         Log.i(TAG, "animation started"); 
        } 

        @Override 
        public void onAnimationEnd(Animator animation) { 
         Log.i(TAG, "animation ended"); 

         cvSearchResults.setVisibility(View.VISIBLE); 
        } 
       }); 

       contentAnim.setDuration(300); 
       contentAnim.start(); 

       return true; 
      } 
     }); 
    } 
} 

有没有人对如何解决这个想法?

回答

0

我相信RecyclerView通过RecyclerView.ItemAnimator支持这样的动画。 查看文档。

+0

我试图动画卡,并且那些不在recyclerview,但我想通了 – itayrabin

+0

所以请张贴你如何解决它,所以别人应该知道。 – lionscribe

+0

刚刚添加,其实很简单。 – itayrabin

0

所以经过一番思考,我想出了这个简单的解决方案:

cvSearchResults.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
     @Override 
     public boolean onPreDraw() { 
      if(cvSearchResults.getMeasuredHeight() != 0) { 

       cvSearchResults.getViewTreeObserver().removeOnPreDrawListener(this); 

因为我会越来越叫我onPreDraw方法,直到我将删除监听器,我删除它,只有当我知道这个观点一直测量与我给它的recyclerview数据