我的布局有几个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;
}
});
}
}
有没有人知道如何解决这个问题?
答案 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数据测量了视图时才删除它