即使在添加边距后,recyclerView 项目之间的空间也不显示

Posted

技术标签:

【中文标题】即使在添加边距后,recyclerView 项目之间的空间也不显示【英文标题】:Space between recyclerView items not showing even after adding margin 【发布时间】:2021-12-01 07:48:33 【问题描述】:

我尝试在 item_layout 中的 recyclerView 项目之间添加空间。它在 XML 预览中运行良好,但在设备上运行不佳。

city_item_layout:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

<data>

    <variable
        name="viewClickListener"
        type="android.view.View.OnClickListener" />

    <variable
        name="weatherResponseBody"
        type="com.example.weatherapp.model.WeatherResponseBody" />

    <variable
        name="city"
        type="com.example.weatherapp.model.CityWeatherReport" />
</data>

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_
    android:layout_
    android:layout_margin="8dp"
    android:onClick="@viewClickListener"
    android:padding="20dp"
    android:background="@drawable/curved_background"
    android:foreground="?attr/selectableItemBackground"
    android:clickable="true"
    android:focusable="true"
    android:elevation="1dp">

    <ImageView
        android:id="@+id/weather_state_icon_iv"
        android:layout_
        android:layout_
        android:src="@drawable/ic_baseline_wb_sunny_24"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:imageUrl="@city.weatherIcon"/>

    <TextView
        android:id="@+id/city_tv"
        android:layout_
        android:layout_
        android:text="@city.city"
        android:textSize="20sp"
        android:textStyle="bold"
        android:layout_marginStart="20dp"
        app:layout_constraintStart_toEndOf="@id/weather_state_icon_iv"
        app:layout_constraintTop_toTopOf="@id/weather_state_icon_iv"
        tools:text="New York" />

    <TextView
        android:id="@+id/country_tv"
        android:layout_
        android:layout_
        android:text="@city.country"
        android:textStyle="italic"
        app:layout_constraintEnd_toEndOf="@id/city_tv"
        app:layout_constraintTop_toBottomOf="@id/city_tv"
        tools:text="Nigeria" />

    <TextView
        android:id="@+id/weather_state_tv"
        android:layout_
        android:layout_
        android:text="@city.mainWeather"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="@id/weather_state_icon_iv"
        app:layout_constraintStart_toStartOf="@id/weather_state_icon_iv"
        app:layout_constraintTop_toBottomOf="@id/weather_state_icon_iv"
        app:layout_constraintVertical_bias="0.0"
        tools:text="Sunny" />

    <TextView
        android:id="@+id/temperature_tv"
        android:layout_
        android:layout_
        android:layout_marginStart="170dp"
        android:text="@city.tempToString()"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toEndOf="@+id/country_tv"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="@string/temperature" />

</androidx.constraintlayout.widget.ConstraintLayout>

RecyclerView_layout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
tools:context=".MainFragment">

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_
    android:layout_
    android:elevation="2dp"
    android:minHeight="?attr/actionBarSize">

    <TextView
        android:layout_
        android:layout_
        android:text="Weather Forecast"
        android:textSize="18sp"
        android:textStyle="bold" />
</androidx.appcompat.widget.Toolbar>
<LinearLayout
    android:layout_
    android:layout_
    android:paddingHorizontal="20dp">
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/city_list_recycler_view"
        android:layout_
        android:layout_
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        tools:listitem="@layout/city_item_layout" />
</LinearLayout>

XML 预览: enter image description here

在设备上安装后:

enter image description here

我不知道我做错了什么。我需要帮助

【问题讨论】:

为什么你的 RecyclerView 在一个 LinearLayout 里面?只是为了填充?最好使用Android的Space view。 @rtsketo,我在尝试解决问题时用 LinearLayout 封装了 recyclerView 【参考方案1】:

尝试用item_layout.xml 中的LinearLayout 包装你的ConstraintLayout,它应该是:

<LinearLayout
     android:layout_
     android:layout_
     android:layout_margin="10dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_
        android:layout_

        android:onClick="@viewClickListener"
        android:padding="20dp"
        android:background="@drawable/curved_background"
        android:foreground="?attr/selectableItemBackground"
        android:clickable="true"
        android:focusable="true"
        android:elevation="1dp">

<!-- your code here-->

</LinearLayout>

你可以试一试,祝你好运;)

【讨论】:

哇...谢谢。它就像魔术一样工作。【参考方案2】:

我不熟悉 RecyclerView 中的填充,但它似乎忽略了它。一个肯定会起作用的解决方案是将您的 ConstraintLayout 包装在另一个 ConstraintLayout 中,所有边缘的边距为 20dp。

做类似的事情,但使用 FrameLayout 而不是 ConstraintLayout 可能会更高效。

无论如何,我不能保证这是最好的解决方案,但它会起作用。

【讨论】:

我在获取问题解决方案的过程中添加了填充。我会像你说的那样尝试 FrameLayout。谢谢

以上是关于即使在添加边距后,recyclerView 项目之间的空间也不显示的主要内容,如果未能解决你的问题,请参考以下文章

在 RecyclerView 中为分隔线添加边距

如何为最后一个元素为 RecyclerView 添加边距?

RecyclerView 项目不在 GridLayoutManager 的中心

在 RecyclerView 中的单元格之间添加空间? [复制]

在 recyclerview 项目之间滑动

即使滚动RecyclerView,也可以启用单击项目