将 TransitionManager 与 ChangeBounds 结合使用以扩展 RecyclerView 中的项目时,在与 layout_height 结合使用时会产生奇怪的视觉效果:match_constraint

Using TransitionManager with ChangeBounds on expanding item in RecyclerView is making weird visuals when combined with layout_height: match_constraint

我正在为 RecyclerView 使用自定义适配器,我需要在单击项目时展开这些项目。我是按照this用Google推荐的方法实现的。展开工作正常,但使用 TransitionManager.beginDelayedTransition(recyclerView); 的动画并不是我想要的。当我试图在动画期间滚动 RecyclerView 时,也发生了非常奇怪的事情,这会把事情搞砸。

所以我上网寻找不同的动画展开方式。我发现了这个:

            final ChangeBounds transition = new ChangeBounds();
            transition.setDuration(100L);
            TransitionManager.beginDelayedTransition(mRecyclerView,transition);

这非常有效,因为它只会为展开项的行设置动画,然后显示 View.GONE 视图。不涉及 alpha 转换等。但后来我不得不将 RecyclerView 的 layout_heightmatch_parent 更改为 match_constraint 因为软键盘通常会隐藏展开的行(用户可以编辑项目和键盘弹出窗口)。

现在发生了什么: 当我点击展开 RecyclerView 的项目时,它会展开很短的时间,然后回到正常状态,然后开始动画。它制作了非常奇怪的闪烁动画,这很糟糕并且破坏了平滑度。在将 RecyclerView 的 layout_height 设置为 match_parent 之前,它没有这样做,但现在 match_constraint 是。

我正在使用代码来扩展它。按照上面链接的文章。

    final boolean isExpanded = position==mExpandedPosition;
    // Hidden Views
    holder.view1.setVisibility(isExpanded?View.VISIBLE:View.GONE);
    holder.view2.setVisibility(isExpanded?View.VISIBLE:View.GONE);
    holder.view3.setVisibility(isExpanded?View.VISIBLE:View.GONE);

    holder.itemView.setActivated(isExpanded);
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mExpandedPosition = isExpanded? -1:holder.getAdapterPosition();
            // Animace
            final ChangeBounds transition = new ChangeBounds();
            transition.setDuration(100L);
          TransitionManager.beginDelayedTransition(mRecyclerView,transition);

            // Hiding keyboard if it's up
            InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(v.getWindowToken(), 0);


            notifyDataSetChanged();
        }
    });

我做的对吗?我可能遗漏了一些基本的东西。我对 Android 开发还很陌生。谢谢!

我找到了解决办法,也许有人会遇到和我一样的问题。 这真是愚蠢的错误。我将 layout_height 设置为 match_constraint ,而不是 layout_width.

很简单:将 layout_width 设置为 match_constraint 也解决了问题。