getHeight在onPreDrawListenter中返回0

时间:2016-07-29 17:22:23

标签: android animation view

我的布局有几个cardView,里面有recyclerViews 在开始时,第一个recyclelerview是空的,因此卡片不显示。

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

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

当我调用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;
            }
        });
    }
}

有没有人知道如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

我相信RecyclerView通过RecyclerView.ItemAnimator支持此类动画。 参见文档。

答案 1 :(得分:0)

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

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

                cvSearchResults.getViewTreeObserver().removeOnPreDrawListener(this);

因为我将继续调用我的onPreDraw方法,直到我将删除监听器,只有当我知道使用我给它的recyclerview数据测量了视图时才删除它