ListView - 水平中心单元格视图没有ListView高度Wrap_Content

时间:2015-04-21 11:47:21

标签: android performance listview gravity

我目前在使用Android的ListView时遇到了一些格式问题。在浏览了几个关于SO的问题后,我找不到任何合适的解决方案。

我有一个ListView(用于导航),包括一个或多个视图(实际导航项)。我想要实现的是 - ListView使用整个垂直空间(heigth设置为match_parent),并且单元格在此ListView中垂直居中。

This should be the result

简单地将重力设置为适用于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>

1 个答案:

答案 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);