带抽屉的动态大小的首选片段

时间:2016-02-01 22:02:44

标签: android android-layout listview android-fragments

我目前正在尝试在导航抽屉中使用偏好片段。有多个首选项片段可以填充框架布局,所有这些可能具有不同的大小,并且可能不是父级的完整高度。 出于这个原因,我想使用wrap_content作为帧布局高度,但是当优先级片段从ListView扩展时,这会导致问题(引用ListView Wrap Content)。 wrap_content确实提供了所需的结果,虽然我可以看到OnBindView被连续调用,这非常低效并导致我的数据绑定方法一直被调用。

有没有人可以尝试任何简单的解决方案?或者这是自定义视图的情况,我将测量片段的子项并在运行时设置高度?对此有任何帮助将非常感激。

下面的布局显示了主布局中包含的抽屉布局。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:orientation="horizontal"
    android:padding="20dp">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <RadioGroup
            android:id="@+id/drawer_radio"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <RadioButton
                android:id="@+id/drawer_radio_button_0"
                style="@style/ButtonDrawer"
                android:background="@drawable/fft_button"
                android:button="@null"
                android:contentDescription="@string/image_button"/>

            <RadioButton
                android:id="@+id/drawer_radio_button_1"
                style="@style/ButtonDrawer"
                android:background="@drawable/trigger_button"
                android:button="@null"
                android:contentDescription="@string/image_button"/>

        </RadioGroup>
    </LinearLayout>
    <FrameLayout
        android:id="@+id/drawer_preference_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="10dp"
        tools:layout="@android:layout/simple_list_item_1"
        android:background="@drawable/floating_preference_background_shape"/>

</LinearLayout>

1 个答案:

答案 0 :(得分:0)

好的,所以我认为我找到了一个很好的解决方案,所以我认为我会将其发布给其他人使用。 我必须这样做的方法是从PreferenceFragment扩展并在运行时进行一些测量,我可以使用它来调整listView的大小。

我用以下方法做到了这一点。

public class PreferenceFragmentHeightWrap extends PreferenceFragment {

/**
 * We can guarantee that all children will be in the adaptor list by this point
 */
@Override
public void onResume() {
    super.onResume();
    setListViewHeightBasedOnItems(getView());
}

/**
 * Sets ListView height dynamically based on the height of the items.
 *
 * @return true if the listView is successfully resized, false otherwise
 */
public boolean setListViewHeightBasedOnItems(View view) {

    ListView listView = (ListView) view.findViewById(android.R.id.list);
    ListAdapter listAdapter = listView.getAdapter();
    if(listAdapter != null) {

        int numberOfItems = listAdapter.getCount();
        // Get total height of all items.
        int totalItemsHeight = 0;
        for(int itemPos = 0; itemPos < numberOfItems; itemPos++) {
            View item = listAdapter.getView(itemPos, null, listView);
            item.measure(0, 0);
            totalItemsHeight += item.getMeasuredHeight();
        }

        // Get total height of all item dividers.
        int totalDividersHeight = listView.getDividerHeight() *
                (numberOfItems - 1);

        // Set list height.
        ViewGroup.LayoutParams params = view.getLayoutParams();
        params.height = totalItemsHeight + totalDividersHeight + listView.getPaddingBottom()
                + listView.getPaddingTop();
        view.setLayoutParams(params);

        return true;

    } else {
        return false;
    }

}

希望如果你看到任何不幸的事情,这将是有意义的,并随时发表评论。