当兄弟视图位置改变时,如何刷新安卓视图高度?

4

我有一个像这样的Android布局:

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/main_layout"
        android:orientation="vertical">
<android.support.v7.widget.RecyclerView
            android:id="@+id/rv_weighing"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"/>
<android.support.v7.widget.CardView
            xmlns:card_view="http://schemas.android.com/apk/res-auto"
            android:id="@+id/cv_price_holder"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

<!-- another view elements here -->
</android.support.v7.widget.CardView>

</LinearLayout>

基本上,我希望第一个元素填充父元素和第二个元素之间的剩余空间。它工作得很好,直到我在运行时更改第二个元素的Y位置。我尝试在父元素和第一个元素上调用.invalidate().requestLayout(),但似乎不像预期那样工作。
我还尝试使用<RelativeLayout>更改父布局,并在第一个元素上设置android:layout_above="@+id/cv_price_holder",但也没有起作用。
编辑:这是调用以切换布局的方法:
public void togglePriceHolder(){
        float newY = mPriceHolderToggleState ? -mPriceHolderToggleLimitY : mPriceHolderToggleLimitY;
        int newIcon = mPriceHolderToggleState ? R.drawable.ic_keyboard_arrow_down_white_36dp : R.drawable.ic_keyboard_arrow_up_white_36dp;
        mBtnTogglePriceHolder.setImageResource(newIcon);
        mCvPriceHolder.animate().translationYBy(newY).setListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {}

            @Override
            public void onAnimationEnd(Animator animation) {
                // refresh the layout
                rvWeighing.forceLayout();
                mMainLayout.requestLayout();
            }

            @Override
            public void onAnimationCancel(Animator animation) {}

            @Override
            public void onAnimationRepeat(Animator animation) {}
        });    
        mPriceHolderToggleState = !mPriceHolderToggleState;
}

问题是如何刷新布局,以便第一个元素在第二个元素的Y位置发生变化时可以调整其高度?谢谢。

enter image description here

1个回答

4
尝试在可能改变尺寸的视图上调用 forceLayout(),然后调用 requestLayout()。当 requestLayout() 在一个视图上被调用时,该视图的所有父级将被重绘,但兄弟节点不会,对于特定的视图,调用 forceLayout() 将标记该视图为下一个布局遍历过程中需要重新布局的对象(以及默认遍历)。在你的具体情况下,请尝试在要重新绘制的兄弟节点上调用 forceLayout(),然后在其中一个视图上调用 requestLayout()

嗨Sarthak,感谢你的帮忙,但我还是无法让它正常工作。我编辑了问题以添加我用来切换布局的方法。我是不是做错了什么? - qatz
@qatz 你可以尝试调用 mCvPriceHolder 上的 requestLayout,而不是 mMainLayout。对于回复迟了,我很抱歉... - Sarthak Mittal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接