【问题标题】:Setting ListView Height based on items gives extra space at the end in Android Nougat device根据项目设置 ListView 高度在 Android Nougat 设备的末尾提供了额外的空间
【发布时间】:2017-11-07 07:21:52
【问题描述】:

我正在使用以下函数根据 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;
    }
}

上述功能在具有下述屏幕密度的设备以及操作系统上运行良好。

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

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

Samsung Tablet SM T113(Android 4.4.4,600 x 1024 像素,7.0 英寸 屏幕)。

但是,当我在使用 Android Nougat(7.0、7.1.1)的设备上运行相同的设备时,我的 ListView 的最后一项下方出现空白。也就是设置的高度超过了要求。

下面的屏幕截图解释了我所面临的情况。 下面列出了出现此问题的设备:-

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" />

谁能帮我解决我面临的问题。

提前致谢。

【问题讨论】:

  • 尝试将 xml 文件高度中的 listview 设置为“wrap_content”。
  • @DemoMail 我用过,但没有改变。问题还是一样
  • 首先在设备中打开您的列表活动,然后在android studio中,转到工具->android->布局检查器。它将捕获屏幕并将其显示在 android studio 中。只需检查那里,哪个视图正在捕获空间,无论是您的列表视图还是列表视图的单个项目。
  • @DemoMail 我已经按照您的指示进行了检查。它是捕获空间的 Listview 而不是 listView 项。您的任何建议现在结束以解决问题。
  • 为什么要为列表视图项提供动态高度?如果您删除动态高度,那么我认为它会起作用

标签: android android-layout listview listviewitem


【解决方案1】:

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

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

我使用LinearLayoutweight 以及LinearLayout 内的小部件,我将weightsum 和一些margin 提供给Views。 现在,随着整个视图除以 weightsum 视图,额外的边距在我的 ListView 属性底部创建了那些空白,如发布的问题所示。我将LinearLayout 替换为RelativeLayout,并从ViewGroup 中删除了weight 属性,并从View 中删除了weightSum 属性。

它对我有用。

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

我的旧 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 文件,我用RelativeLayout 替换了LinearLayout,并且没有使用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>

希望我的回答可以帮助那些面临同样问题的人...

【讨论】:

    猜你喜欢
    • 2020-10-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2011-03-24
    • 2019-06-21
    • 1970-01-01
    相关资源
    最近更新 更多