将自定义形状应用于android listview

时间:2017-08-14 19:51:12

标签: java android listview

您好我正在尝试将自定义形状和视图应用到我的Android列表视图中。当列表视图中添加了足够的元素时,它必须滚动才能看到所有元素。但如果少于它,则看起来像enter image description here

    <ListView
    android:id="@+id/recipe_list_view"
    android:layout_width="333dp"
    android:layout_height="163dp"
    android:layout_marginTop="46dp"
    android:background="@drawable/shape"
    android:divider="@color/darkblue"
    android:dividerHeight="10.0sp"
    android:gravity="center"
    android:textAlignment="center"
    app:layout_constraintLeft_toLeftOf="@+id/constraintLayout2"
    app:layout_constraintRight_toRightOf="@+id/constraintLayout2"
    app:layout_constraintTop_toBottomOf="@+id/imageView3"></ListView>

这是我可绘制的形状

    <shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:startColor="#2ECC71"
        android:endColor="#2ECC71"
        android:angle="270"/>

    <corners
        android:bottomRightRadius="7dp"
        android:bottomLeftRadius="7dp"
        android:topLeftRadius="7dp"
        android:topRightRadius="7dp"/>
</shape>

这是实现列表视图的代码

mListView = (ListView) findViewById(R.id.listView);
            String[] listItems = new String[listOfUserIds.size()];

            for(int i = 0; i < users.size(); i++){
                listItems[i] = users.get(i);
            }

            ArrayAdapter adapter = new ArrayAdapter(EventDetailsActivity.this, android.R.layout.simple_list_item_1, listItems);
            mListView.setAdapter(adapter);

这是有足够元素滚动时的样子

enter image description here

2 个答案:

答案 0 :(得分:1)

您为listView提供了背景,列表视图高度为.... var api = new ParseServer({ databaseURI: databaseUri || 'mongodb://localhost:27017/dev', cloud: process.env.CLOUD_CODE_MAIN || __dirname + '/cloud/main.js', appId: process.env.APP_ID || 'myAppId', masterKey: process.env.MASTER_KEY || 'myMasterKey', //Add your master key here. Keep it secret! serverURL: process.env.SERVER_URL || 'http://localhost:1337/parse', // Don't forget to change to https if needed clientKey: '', <=== possibly not needed, just to be sure liveQuery: { classNames: ["Scores", "Posts", "Comments"] // List of classes to support for query subscriptions } }); ,因此如果只有少数项目,则不会填充整个布局。所以你可以看到背景。解决方案是提供163dp而不是给出固定高度,而不是给列表背景,你应该给列表项。

答案 1 :(得分:0)

Muthukrishnan的答案在技术上是正确的,但它似乎并没有真正解决“我怎么能有ListView圆角?”的问题。

正如他所说,您应该从ListView标记中删除背景,而是将背景应用于项目视图。如果你这样做,你将(a)有一个方形列表视图或(b)在每个项目上都有圆角。

不幸的是,没有很好的方法可以在ListView处提供圆角但不提供背景。

我能想到的最佳解决方案是在View上叠加第二个ListView并使用此视图绘制圆角。我使用了一个矢量drawable来做到这一点。

这是一个非常简单的应用程序,显示了这一点。

<强> activity_main.xml中

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#777">

    <FrameLayout
        android:layout_width="333dp"
        android:layout_height="163dp"
        android:layout_gravity="center">

        <ListView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:divider="#00ffffff"
            android:dividerHeight="10dp"/>

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:srcCompat="@drawable/fake_rounded_corners"/>

    </FrameLayout>

</FrameLayout>

<强> itemview.xml

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:gravity="center_vertical"
    android:textColor="@color/colorPrimary"
    android:textSize="18sp"
    android:background="#fff"/>

<强> fake_rounded_corners.xml

<vector
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="333dp"
    android:height="163dp"
    android:viewportWidth="333.0"
    android:viewportHeight="163.0">

    <path
        android:fillColor="#777"
        android:pathData="M0 7v-7h7a7 7 0 0 0 -7 7"/>

    <path
        android:fillColor="#777"
        android:pathData="M326 0h7v7a7 7 0 0 0 -7 -7"/>

    <path
        android:fillColor="#777"
        android:pathData="M333 156v7h-7a7 7 0 0 0 7 -7"/>

    <path
        android:fillColor="#777"
        android:pathData="M0 156v7h7a7 7 0 0 1 -7 -7"/>

</vector>