即使在添加边距后,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 项目不在 GridLayoutManager 的中心