简体   繁体   English

Android RecyclerView平滑滚动以查看其动画高度

[英]Android RecyclerView smooth scroll to view that's animating their height

I have a RecyclerView with Expandable Child Views, when the child ViewGroup is clicked it inflates an amount of views animating the ViewGroup height from 0 to the measured viewgroup height, like the following gif: 我有一个带有可扩展子视图的RecyclerView,当单击子ViewGroup时,它会将ViewGroup高度从0调整为测量视图组高度的视图数量膨胀,如下面的gif所示:

例

The problem is: I'm calling smoothScrollToPosition on recyclerView, it smooth scroll to the view position, but it considers the current view height, which is still not expanded, in the above gif i'm touching on the under view of the recyclerview, which dont scroll to position because the view is already visible, but when i touch again (calling the smoothscrolltoposition again) it scroll the view to the correct position, because the view is already expanded. 问题是:我在recyclerView上调用smoothScrollToPosition,它平滑滚动到视图位置,但是在上面的gif中我认为当前的视图高度仍然没有展开,我正在回收在recyclerview的视图下面,由于视图已经可见,因此不会滚动到位置,但是当我再次触摸(再次调用smoothscrolltoposition)时,它会将视图滚动到正确的位置,因为视图已经展开。

Is there any approach to scroll the view to the top of screen or just scroll to make content visible? 有没有办法将视图滚动到屏幕顶部或只是滚动以使内容可见?

For references: This is the method called to inflate the views: 对于引用:这是调用以扩展视图的方法:

collapsible_content.removeAllViews();
for(int i = 0; i < 5; i++) {
        View link_view = getLayoutInflater().inflate(R.layout.list_item_timeline_step_link, collapsible_content, false);
        TextView text = (TextView) link_view.findViewById(R.id.step_link_text);
        text.setText("Test");
        collapsible_content.addView(link_view);
    }

And this is my method to expand: 这是我扩展的方法:

public void toggle() {
        collapsible_content.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        Animation a;
        if (mExpanded) {
            a = new ExpandAnimation(collapsible_content.getLayoutParams().height, 0);
        } else {
            a = new ExpandAnimation(collapsible_content.getLayoutParams().height, getMeasuredHeight());
        }
        a.setDuration(mAnimationDuration);
        collapsible_content.startAnimation(a);
        mExpanded = !mExpanded;
    }

And the animation: 和动画:

private class ExpandAnimation extends Animation {
        private final int mStartHeight;
        private final int mDeltaHeight;

        public ExpandAnimation(int startHeight, int endHeight) {
            mStartHeight = startHeight;
            mDeltaHeight = endHeight - startHeight;
        }

        @Override
        protected void applyTransformation(float interpolatedTime,
                                           Transformation t) {
            final int newHeight = (int) (mStartHeight + mDeltaHeight *
                    interpolatedTime);
            collapsible_content getLayoutParams().height = newHeight;

            if (newHeight <= 0) {
                collapsible_content setVisibility(View.GONE);
            } else {
                collapsible_content setVisibility(View.VISIBLE);
            }
            collapsible_content requestLayout();
        }


        @Override
        public boolean willChangeBounds() {
            return true;
        }
    }

My solution was to constant check for view bottom within applyTransformation method, and compare it with RecyclerView height, if the bottom get higher than the RV height, i scroll by the diff values: 我的解决方案是在applyTransformation方法中不断检查视图底部,并将其与RecyclerView高度进行比较,如果底部高于RV高度,我滚动diff值:

final int bottom = collapsible_content.getBottom();
final int listViewHeight = mRecyclerView.getHeight();
if (bottom > listViewHeight) {
    final int top = collapsible_content.getTop();
    if (top > 0) {
        mRecyclerView.smoothScrollBy(0, Math.min(bottom - listViewHeight + mRecyclerView.getPaddingBottom(), top));
    }
}

The trick was to use Math.min to get the view top, so it don't scroll up making the top not visible. 诀窍是使用Math.min来获取顶部视图,因此它不会向上滚动使顶部不可见。

Solution based on ListViewAnimations 基于ListViewAnimations的解决方案

添加animationlistener并在展开动画完成后开始滚动recyclelerview。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM