根据项目设置ListView高度在Android Nougat设备的最后提供了额外的空间

时间:2017-11-07 07:21:53

标签: android android-layout listview listviewitem

我使用下面的函数根据ListView中的项目数动态设置ListView的高度。

public boolean setListViewHeightBasedOnItems(ListView listView, String select) {
    MyListAdapter adapter = (MyListAdapter) listView.getAdapter();
    if (adapter != null) {
        int numberOfItems = adapter.getCount();

        // Get total height of all items.
        int totalItemsHeight = 0;
        for (int itemPos = 0; itemPos < numberOfItems; itemPos++) {
            View item = adapter.getView(itemPos, null, listView);
            float px = 300 * (listView.getResources().getDisplayMetrics().density);
            item.measure(View.MeasureSpec.makeMeasureSpec((int) px, View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
            totalItemsHeight += item.getMeasuredHeight();
        }

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

        // Get padding
        int totalPadding = listView.getPaddingTop() + listView.getPaddingBottom();

        // Set list height.
        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalItemsHeight + totalDividersHeight + totalPadding; // +50
        listView.setLayoutParams(params);
        listView.requestLayout();
        return true;
    } else {
        return false;
    }
}

上述功能在具有下面提到的屏幕密度和OS的设备上运行良好。

  

Moto E3 Power(Android 6.0,720 x 1280像素,5.0英寸屏幕)。

     

联想A6010(Android 5.0.2,720 x 1280像素,5.0英寸屏幕)。

     三星平板电脑SM T113(Android 4.4.4,600 x 1024像素,7.0英寸   屏幕)。

Screen Shot of devices where the function works well

但是,当我在装有Android Nougat(7.0,7.1.1)的设备上运行相同的操作时,我在ListView的最后一项下面会出现空白区域。也就是说,设置的高度超过了要求。

下面的屏幕截图解释了我面临的问题。 enter image description here 提出此问题的设备如下: -

  

Moto E4 Plus(Android - 7.1.1,720 x 1280像素,5.5英寸屏幕)。

     

Moto E5 Plus(Android - 7.0,1080 x 1920像素,5.2英寸屏幕)。

下面是我对ListView的XMl声明。

<ListView
        android:id="@+id/lv_menu_details"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="@dimen/dp10"
        android:layout_marginRight="@dimen/dp10"
        android:divider="@color/transparent" />

任何人都可以帮我解决我面临的问题。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我已经解决了我所面临的问题。

对于我来说,该解决方案在于我用于“列表视图”的适配器的项目列表中。

我在LinearLayoutweight中使用weightsum,在LinearLayout中的小部件上,我将margin和一些Views给予了ListView。 现在,随着整个视图除以权重和视图,额外的余量将在我的LinearLayout属性底部创建空白,如发布的问题所示。我将RelativeLayout替换为weight,并从我的ViewGroup的{​​{1}}和weightSum属性中删除了View属性。

它对我有用。

对于那些面临相同问题的人,我将在下面发布xml文件以供参考:

我的Old item_list.xml文件用于ListView项目UI:

<?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="wrap_content"
    android:background="@color/white"
    android:orientation="horizontal"
    android:paddingLeft="@dimen/dp10"
    android:paddingTop="@dimen/dp10"
    android:paddingBottom="@dimen/dp10"
    android:paddingRight="@dimen/dp5"
    android:weightSum="5">

    <CheckBox
        android:id="@+id/iv_checkbox"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:button="@drawable/selector_checkbox_menu_detail_item"
        android:textColor="@color/white"
        android:textSize="@dimen/sp18" />

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2.3"
        android:text="dsfdsfds"
        android:textColor="@color/black"
        android:textSize="@dimen/sp15" />

    <TextView
        android:id="@+id/tv_price"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.7"
        android:text="dsfdsfds"
        android:textColor="@color/black"
        android:layout_marginRight="@dimen/dp10"
        android:textSize="@dimen/sp15" />

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:id="@+id/layout_add_sub"
        android:layout_weight="1.5"
        android:orientation="horizontal"
        android:weightSum="3">

        <ImageView
            android:id="@+id/iv_subtract"
            android:layout_width="@dimen/dp30"
            android:layout_height="@dimen/dp25"
            android:layout_weight="1"
            android:background="@drawable/button_shape"
            android:padding="@dimen/dp5"
            android:src="@drawable/minus" />

        <TextView
            android:id="@+id/tv_count"
            android:layout_width="@dimen/dp30"
            android:layout_height="@dimen/dp25"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:background="@drawable/button_shape"
            android:gravity="center"
            android:text="1"
            android:textColor="@color/black" />

        <ImageView
            android:id="@+id/iv_add"
            android:layout_width="@dimen/dp30"
            android:layout_height="@dimen/dp25"
            android:layout_marginRight="@dimen/dp5"
            android:layout_weight="1"
            android:background="@drawable/button_shape"
            android:padding="@dimen/dp5"
            android:src="@drawable/add" />
    </LinearLayout>

</LinearLayout>

我的list_item.xml文件中,我用LinearLayout替换了RelativeLayout,而没有使用weightweightSum属性:-

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/app_background_color"
    android:orientation="horizontal"
    android:paddingTop="@dimen/dp10"
    android:paddingBottom="@dimen/dp10">

    <CheckBox
        android:id="@+id/iv_checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="@dimen/dp5"
        style="@style/CheckBoxStyle"
        android:layout_marginRight="@dimen/dp5"
        android:textColor="@color/app_text_color_primary"
        android:textSize="@dimen/sp18" />

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/iv_checkbox"
        android:layout_toLeftOf="@+id/liLayRightPanel"
        android:text="dsfdsfd"
        android:layout_centerVertical="true"
        android:layout_marginRight="@dimen/dp10"
        android:textColor="@color/app_text_color_primary"
        android:textSize="@dimen/sp15" />

    <LinearLayout
        android:id="@+id/liLayRightPanel"
        android:orientation="horizontal"
        android:layout_alignParentRight="true"
        android:layout_marginRight="@dimen/dp5"
        android:layout_centerVertical="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/tv_price"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="dsfdsfd"
            android:layout_gravity="center"
            android:gravity="center"
            android:textColor="@color/app_text_color_primary"
            android:layout_marginRight="@dimen/dp10"
            android:textSize="@dimen/sp15" />

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/layout_add_sub"
            android:layout_weight="3"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/iv_subtract"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/circle_theme_bkgnd"
                android:padding="@dimen/dp5"
                android:src="@drawable/minus" />

            <TextView
                android:id="@+id/tv_count"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="@dimen/dp5"
                android:layout_marginRight="@dimen/dp5"
                android:textSize="@dimen/sp16"
                android:textStyle="bold"
                android:layout_gravity="center"
                android:layout_weight="1"
                android:gravity="center"
                android:text="0"
                android:textColor="@color/app_text_color_primary" />

            <ImageView
                android:id="@+id/iv_add"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/circle_theme_bkgnd"
                android:padding="@dimen/dp5"
                android:src="@drawable/add" />
        </LinearLayout>

    </LinearLayout>

</RelativeLayout>

希望我的答案可以帮助面临相同问题的人...