【问题标题】:Android: scroll down after animation of LinearLayout.addviewAndroid:LinearLayout.addview动画后向下滚动
【发布时间】:2015-06-07 14:00:28
【问题描述】:

我想列出滚动视图中的项目。 所以我把一个LinearLayout放在一个Scrollview里面。 linearLayout 中已经有一个项目:一个用于添加项目的视图。 我希望该项目始终位于我列表的底部。 (完成了)

但是当我通过执行下面的代码添加一个项目时,我要添加视图的项目会出现在屏幕之外。

linearLayout.addView(theview, linearLayout.getChildCount() - 1);

视图被插入动画:

screen.android:animateLayoutChanges="true"

所以我的问题是我如何在动画期间向下滚动滚动视图,以便我的项目留在屏幕上。

这些是一些屏幕截图。

感谢

【问题讨论】:

  • 尝试类似:myScrollView.scrollTo(0, myView.getY()+50);
  • 是的,但是我什么时候调用它。我在执行 linearLayout.addview 后无法立即向下滚动,因为它是动画的

标签: android scrollview android-linearlayout


【解决方案1】:

你应该在 addView 之后在 post 方法中调用 scrollTo 或 fullScroll。

scrollView.post(new Runnable() {
    @Override
    public void run() {
        scrollView.fullScroll(ScrollView.FOCUS_DOWN);
    }
});

参考:How to Programmatically Scroll a ScrollView to Bottom

【讨论】:

    【解决方案2】:

    在布局动画结束后实现ScrollView的平滑滚动。

    首先在代码中添加LayoutTransition,而不是在xml中

    final LayoutTransition layoutTransition = mainLinearLayoutContainer.getLayoutTransition();
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
        layoutTransition.enableTransitionType(LayoutTransition.CHANGING);
    }
    layoutTransition.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, 0);
    

    然后创建LayoutTransition.TransitionListener 项目以能够多次添加/删除它。 此外,您还需要在翻译结束时删除 transitionListener,因为 endTransition() 回调被多次调用并且它破坏了 smoothScroll。

    final LayoutTransition.TransitionListener transitionListener = new LayoutTransition.TransitionListener() 
    {
        @Override
        public void startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {}
    
        @Override
        public void endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) 
        {
            // Remove TransitionListener because endTransition is called multiple times and it brokes smoothScroll
            layoutTransition.removeTransitionListener(this);
            scrollContainer.post(new Runnable() 
            {
                @Override
                public void run() {
                    scrollContainer.smoothScrollTo(0, scrollContainer.getBottom());
                }
            });
        }
    };
    

    最后添加动画起点。

    button.setOnClickListener(new View.OnClickListener() 
    {
        @Override
        public void onClick(View v) 
        {
            if (licenseLabel.getVisibility() == View.GONE) 
            {
                layoutTransition.addTransitionListener(transitionListener);
                button.setVisibility(View.VISIBLE);
            } 
            else {
                licenseLabel.setVisibility(View.GONE);
            }
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多