【发布时间】: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