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

时间:2018-06-19 14:29:43

标签: java android animation android-recyclerview expand

我正在使用Custom Adapter for 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开发的新手。谢谢!

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,也许有人会面临与我相同的问题。 这真是愚蠢的错误。我将from ctypes import * so = cdll.LoadLibrary(...) so.foo.argtypes = [ ... POINTER(POINTER(c_char)), # ParNameList ... ] so.foo.restype = c_int #... ParNameList = POINTER(c_char)() so.foo(..., ParNameList ,...) 设置为(char (*)[MAX_PARAM_NAME]),但没有将layout_height设置为

那么简单:将match_constraint设置为layout_width也可以解决问题。