在扩展子高度时扩展父母的身高

时间:2015-12-16 16:56:42

标签: android android-layout expandablelistview

我正在使用此ExpandableView组件https://github.com/nicolasjafelle/ExpandableView

有一个主要类:https://github.com/nicolasjafelle/ExpandableView/blob/master/ExpandableViewProject/expandableview/src/main/java/com/expandable/view/ExpandableView.java

组件包装用户指定的其他自定义组件。当自定义组件具有固定高度时,一切正常。

但是,我正在创建一个具有动态行数的自定义组件。假设这是初始状态:

this is row1
this is row2
this is row3
button

当我点击按钮时,它会显示

this is row1
this is row2
this is row3
this is row4
button

当我在LinearLayout中测试我的组件时,没有问题,并显示新行。但是,当我在ExpandableView中嵌入我的自定义组件时,ExpandableView的ContentView不会扩展以包装新行,而是隐藏在底部的按钮。

我想允许ExpandableView的ContentView根据内部自定义组件的大小动态扩展我应该实现ExpandableView的onMeasure()方法。但到目前为止,我所有的测试都失败了。

我的自定义组件的层次结构是:

  • ...
  • ExpandableView(RelativeLayout的扩展,没有onMeasure方法)
  • LinearLayout(以XML格式定义)
  • ExpandableView(RelativeLayout的扩展,没有onMeasure方法)
  • 我的自定义组件(WeekTimes,LinearLayout的扩展名,no onMeasure方法)

有什么想法吗?

我想这是ExpandableView组件中的一个错误,但不知道如何修复它。

更多细节:这是实例化ExpandableView的代码:

    ExpandableView expandableContract = (ExpandableView) formsContained.findViewById(R.id.expandable_academy);
    expandableContract.fillData(R.drawable.button_selected_full, getStringResource(R.string.about_academy), false);
    expandableContract.addContentView(getLayoutInflater().inflate(R.layout.activity_offer_form_academy, new ExpandableView(this), true));

其中R.layout.activity_offer_form_academy只是我的组件的布局:

<com.dynassets.assets.util.weektimes.WeekTimes
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/weektimes"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

我的自定义组件的代码是

public class WeekTimes extends LinearLayout {

    public WeekTimes(Context context) {
        super(context);
        init();
    }

    public WeekTimes(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
        setOrientation(LinearLayout.VERTICAL);
        Button button = new Button(getContext());
        button.setText("click me");
        addView(button);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    Button button = new Button(getContext());
                    button.setText("click me2");
                    addView(button);
                    requestLayout();

                } catch (Exception e) {
                    Log.e("MyApp", "exception", e);
                }
            }
        });
    }
}

那么,如何告诉父ExpandableView根据孩子的身高进行扩展?这是创建onMeasure()方法的问题吗?

1 个答案:

答案 0 :(得分:0)

嗯,问题是ExpandableView包含一个动画,这个动画正在修复高度,防止android布局按预期工作。这里有更详细的描述:

https://github.com/nicolasjafelle/ExpandableView/issues/5

因此修复程序会在动画结束后将高度重新分配给相对值。通过在动画方法上的ExpandableView扩展上添加这些新行来修复问题:

animator.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        // release height
        ViewGroup.LayoutParams layoutParams = contentLayout.getLayoutParams();
        layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
        contentLayout.setLayoutParams(layoutParams);
    }
});