如何在ListView中更改视图的高度并且不要让其子项重新布局?

时间:2014-11-03 08:35:54

标签: android listview android-animation

我需要实现这个东西,ListView中项目的高度会慢慢减少,当它的高度减少到0时,它就消失了。在此过程中,项目下方的剩余视图应该缓慢上升。

首先,我使用ObjectAnimator来更改' scaleY'但是项目占用的大小没有改变,当Animator结束时,ListView刷新,空矩形消失了。

ObjectAnimator oa = ObjectAnimator.ofFloat(itemView, 'scaleY', 1f, 0f);

我发现了另一种方法,我写了一个Runnable来改变项目的高度,但是我的项目中有一些子视图,比如ImageView,高度在变化,ImageView也在变化,我想这看起来不太好。

LayoutParams lp = itemView.getLayoutParams();
lp.height = newHeight;
itemView.setLayoutParams(lp);

最后,我找到了第三种方法,改变了底部'项目的值,是的,它看起来像一个高度减小的窗口,但高度没有改变,项目下方的剩余视图没有移动,直到Runnable结束并且ListView刷新。

itemView.setBottom(itemView.getTop() + newHeight);

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我做了类似的事情并且工作正常:

public  void collapse(final View v, final int toHeight, final int toWidth) {
        final int initialHeight = v.getMeasuredHeight();

        Animation a = new Animation() {
            @Override
            protected void applyTransformation(float interpolatedTime, Transformation t) {


                v.getLayoutParams().height = (int) (toHeight * interpolatedTime);


                v.getLayoutParams().width = (int) (toWidth * interpolatedTime);

                v.requestLayout();


            }

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

        // 1dp/ms
        a.setDuration(ANIMATION_DURATION);
        a.setInterpolator(new AccelerateInterpolator());
        v.startAnimation(a);

    }

布局中设置的高度无法修复(put wrap_content)。希望对你有帮助!!