我目前在使用Android的ListView时遇到了一些格式问题。在浏览了几个关于SO的问题后,我找不到任何合适的解决方案。
我有一个ListView(用于导航),包括一个或多个视图(实际导航项)。我想要实现的是 - ListView使用整个垂直空间(heigth设置为match_parent),并且单元格在此ListView中垂直居中。
简单地将重力设置为适用于ListView的center_vertical并不起作用。我目前只能将ListView包装在另一个视图中(将引力设置为center_vertical)并将ListView的高度更改为wrap_content。但这似乎不是一个完美的解决方案,因为生成的测量操作(适配器的getView方法在同一位置被多次调用)会对性能产生影响,即使对导航项应用合适的持有者概念也是如此。这个问题有什么解决方案吗?
ListView(重力不起作用):
<ListView android:id="@+id/lvNavigation"
android:layout_width="@dimen/navWidth"
android:layout_height="match_parent"
android:gravity="center_vertical" />
带有解决方法的ListView(性能不佳):
<LinearLayout android:layout_width="@dimen/navWidth"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center_vertical">
<ListView android:id="@+id/lvNavigation"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
导航项目:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_weight="match_parent"
android:gravity="center_vertical"
android:orientation="vertical"
android:paddingLeft="@dimen/horizontalMargin"
android:paddingRight="@dimen/horizontalMargin">
...
</LinearLayout>
答案 0 :(得分:1)
Listview可能是用于此目的的坏事。我认为您应该使用具有自定义Layout Manager
的回收站视图特别是你可能想要覆盖onLayoutChildren
我做了一个快速搜索,找不到一个已经为你做这个的库。
或者,如果您有可以预测高度的元素,则add a header view为空白,并设置高度以使列表项显示为居中。
类似
ListView lv = getListView();
LayoutInflater inflater = getLayoutInflater();
ViewGroup header = (ViewGroup)inflater.inflate(R.layout.header, lv, false);
header.setLayoutParams(new AbsListView.LayoutParams(<width>, <height>));
lv.addHeaderView(header, null, false);