是否可以在expandableListView的标题中有一个listView项

时间:2014-04-29 01:07:03

标签: android xml android-listview expandablelistview

基本上我需要通过适配器动态提供一些内容来填充我的expandableListView的标题,这必须是可能的,但是在这个问题上找到任何资源真的很难。

以下是我要做的事情。

1 个答案:

答案 0 :(得分:0)

是的,但您需要覆盖 onGlobalLayout(),并在标题中设置listView的高度,例如

final ExpandableListView lExpView = (ExpandableListView) view.findViewById(R.id.expandable_list);

View viewHdr = getActivity().getLayoutInflater().inflate(R.layout.pager_header, lExpView, false);
final ListView lView = (ListView) viewHdr.findViewById(R.id.item_hdr_list);

...

lView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @SuppressLint("NewApi")
    @SuppressWarnings("deprecation")
    @Override
    public void onGlobalLayout() {
        if (lView.getVisibility() == View.VISIBLE) adjustTotalHeightOfListView(lView, lExpView);
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN)
                lExpView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            else
                lExpView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }
    });

其中 adjustTotalHeightOfListView()是您自己设计的一种方法,可以计算和设置listView的高度,同时包含在可展开列表视图的标题中。如果listView中的各个项目的高度可以超过一个文本行(宽度比可扩展列表视图宽度宽,并且您设置了 WRAP_CONTENT ),则这会变得有点复杂,因为实际宽度包含ExpandableListView的内容在呈现之前不可用,但我们需要至少进行一次猜测以允许这种情况发生。因此,您需要一些看起来有点像(未经测试)的代码:

if (listView == null) return;
ListAdapter mAdapter = listView.getAdapter();
if (mAdapter == null) return;
int totalHeight = listView.getPaddingBottom() + listView.getPaddingTop();
int viewWidth = ( parent == null || parent.getWidth() <= 0 )
            ? listView.getWidth()
            : parent.getWidth();

....

for (int i = 0; i < mAdapter.getCount(); i++) {
    View mView = mAdapter.getView(i, null, listView);

    mView.measure(
            View.MeasureSpec.makeMeasureSpec(viewWidth, (viewWidth > 0) 
                ? View.MeasureSpec.AT_MOST 
                : View.MeasureSpec.UNSPECIFIED
            ),
            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
    );
    totalHeight += mView.getMeasuredHeight() + listView.getDividerHeight();
}

....

ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight;
listView.setLayoutParams(params);
listView.requestLayout();

注意:? View.MeasureSpec.AT_MOST:View.MeasureSpec.UNSPECIFIED measure()语句中进行攻击,基本上它可以应对在父视图之前进行的调用展开/设置宽度。如果设置的宽度不超过它,那么如果指定了WRAP_CONTENT并且宽度大于父级,则将调整高度,否则假设您可以与内容一样宽。

其中: pager_header.xml

<?xml version="1.0" encoding="utf-8"?>

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:orientation="vertical"
      android:gravity="center">

    <ListView
        android:id="@+id/item_hdr_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" />

</GridLayout>

并且主要布局包含:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical"
      android:gravity="center">

    <ExpandableListView
        android:id="@+id/expandable_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center_horizontal"
        android:paddingBottom="10dp" />

</LinearLayout>