0

拡張可能なリスト ビューを使用して 3 レベルの階層を作成しています。内部リストの高さと幅を設定する方法を知りたいです。この目的のために onMeasure があることは知っていましたが、私の場合、親リスト ビューのスペース全体をキャプチャすることはできません。

間違った値を与えている可能性があります。これは、子の展開可能なリストの高さと幅を設定するために使用しているコードです。

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
    {

        widthMeasureSpec = MeasureSpec.makeMeasureSpec(960,MeasureSpec.AT_MOST);
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(800,MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

現在、次のように表示されます

<ParentGroup1                >
<ChildParentGroup>
<Child1>
<Child2>
<child3>
<ParentGroup2                >

以下のように表示されます。

<ParentGroup1                >
<ChildParentGroup            >
<Child1                      >
<Child2                      >
<child3                      >
<ParentGroup2                >

同じことをアドバイス/提案してください。

御時間ありがとうございます。

4

7 に答える 7

2

まだ答えを探しているかどうかはわかりませんが、これが私が行った方法です:コンストラクターで親ビューへの参照と高さの測定値 (この場合、子リストのサイズを使用しました) を渡して作成します子カスタム リスト。

public CustomExpandableList(Context context, View the_parentView, int the_heightMeasure)
{ 
    super(context);
    WIDTH = the_parentView!=null?the_parentView.getWidth():LayoutParams.MATCH_PARENT;
    HEIGHT = the_heightMeasure * 500;
}

編集:または、コードの一貫性を高めるために、親ビュー自体を渡す代わりに、parentView の幅と高さの測定値をコンストラクターに渡すことができます。CustomExpandableList(Context the_context, int the_width, int the_heightMeasure)

于 2013-09-04T16:58:19.730 に答える
2

このコードを使用して、展開可能なリスト ビューを動的に計算します。

    // calculate the height of expandable listView without expanded
      private void setListViewHeight(ExpandableListView expListView) {
    ListAdapter listAdapter = expListView.getAdapter();
    int totalHeight = 0;

    for (int i = 0; i < listAdapter.getCount(); i++) {
        View listItem = listAdapter.getView(i, null, expListView);
        listItem.measure(0, 0);
        totalHeight += listItem.getMeasuredHeight();
        System.out.println("i  " + i);
    }

    ViewGroup.LayoutParams params = expListView.getLayoutParams();
    params.height = totalHeight
            + (expListView.getDividerHeight() * (listAdapter.getCount() - 1));
    System.out.println("params.height =  " + params.height);

    expListView.setLayoutParams(params);
    expListView.requestLayout();
}

// calculate the height of expandable listview dynamically
private void setListViewHeight(ExpandableListView expListView, int group) {

    ExpandableListAdapter listAdapter = expListView
            .getExpandableListAdapter();
    int totalHeight = 0;
    int desiredWidth = MeasureSpec.makeMeasureSpec(expListView.getWidth(),
            MeasureSpec.UNSPECIFIED);
    for (int i = 0; i < listAdapter.getGroupCount(); i++) {
        View groupItem = listAdapter.getGroupView(i, false, null,
                expListView);
        groupItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);

        totalHeight += groupItem.getMeasuredHeight();

        if (((expListView.isGroupExpanded(i)) && (i == group))
                || ((!expListView.isGroupExpanded(i)) && (i == group))) {

            for (int j = 0; j < listAdapter.getChildrenCount(i); j++) {

                View listItem = listAdapter.getChildView(i, j, false, null,
                        expListView);

                Log.e("Count", listAdapter.getChildrenCount(i) + "");

                listItem.setLayoutParams(new ViewGroup.LayoutParams(
                        desiredWidth, MeasureSpec.UNSPECIFIED));
                // listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
                listItem.measure(MeasureSpec.makeMeasureSpec(0,
                        MeasureSpec.UNSPECIFIED), MeasureSpec
                        .makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
                totalHeight += listItem.getMeasuredHeight();

                System.out.println("totalHeight" + totalHeight);
                Log.e("TEST", "gshdkfmjfy,");

            }
        }
    }

    ViewGroup.LayoutParams params = expListView.getLayoutParams();
    int height = totalHeight
            + (expListView.getDividerHeight() * (listAdapter
                    .getGroupCount() - 1));

    if (height < 10) {
        height = 100;
    }
    params.height = height;
    expListView.setLayoutParams(params);
    expListView.requestLayout();

}
于 2014-01-29T09:22:55.803 に答える
1

私はこれを行うことで数日前に成功しました。もう少しコンパクトで、追加のパラメーターがなく、完全に機能します。

public static void setExpandableListViewHeightBasedOnChildren(ExpandableListView expandableListView){
    ExpandableNotesListAdapter adapter = (ExpandableNotesListAdapter) expandableListView.getExpandableListAdapter();
    if (adapter == null){
        return;
    }
    int totalHeight = expandableListView.getPaddingTop() + expandableListView.getPaddingBottom();
    for (int i = 0 ; i < adapter.getGroupCount() ; i++){
        View groupItem = adapter.getGroupView(i, false, null, expandableListView);
        groupItem.measure(View.MeasureSpec.UNSPECIFIED,View.MeasureSpec.UNSPECIFIED);
        totalHeight += groupItem.getMeasuredHeight();

        if (expandableListView.isGroupExpanded(i) ){
            for( int j = 0 ; j < adapter.getChildrenCount(i) ; j++) {
                View listItem = adapter.getChildView(i, j, false, null, expandableListView);
                listItem.setLayoutParams(new LayoutParams(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED));
                listItem.measure(View.MeasureSpec.makeMeasureSpec(0,
                        View.MeasureSpec.UNSPECIFIED), View.MeasureSpec
                        .makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
                totalHeight += listItem.getMeasuredHeight();

            }
        }
    }

    ViewGroup.LayoutParams params = expandableListView.getLayoutParams();
    int height = totalHeight + expandableListView.getDividerHeight() * (adapter.getGroupCount() - 1);

    if (height < 10)
        height = 100;
    params.height = height;
    expandableListView.setLayoutParams(params);
    expandableListView.requestLayout();
}

ビューを初期化するとき、アダプターを設定するときなどに、これを追加することを忘れないでください。

Functions.setExpandableListViewHeightBasedOnChildren(listView);
listView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
    @Override
    public void onGroupExpand(int groupPosition) {
        Functions.setExpandableListViewHeightBasedOnChildren(listView);
    }
});
于 2015-02-06T20:40:59.490 に答える
0

ParentGroup と ChildParentGroup 用に 1 つのレイアウト xml ファイルを作成し、Child 用に別のレイアウト xml ファイルを作成します。これで、問題は 2 レベルの階層に縮小されました。次に、展開可能なリストビューには、親と子のレイアウトを膨張させて使用するための親ビューと子ビューのメソッドがあります。したがって、そのメソッドでは、やりたいことが何でもできます。

于 2013-04-10T12:47:28.973 に答える