在我的RecyclerView元素中,最后一个元素上下的边距不正确。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在我的RecyclerView元素中,最后一个元素上下的边距不正确。相关的知识,希望对你有一定的参考价值。

问题。 如果ImageView是VISIBLE,并且 fragment_list_element_content TextView只有几行文字,上下左右的边距 fragment_list_element_text_view_group 太大。如果ImageView是GONE,并且 fragment_list_element_content TextView有很多行文字,上下的边距。fragment_list_element_text_view_group 都太小了。

image of incorrect margins

我的问题布局的xml。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        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"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/fragment_list_element_background"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/roundrect_fragment_list_element_background"
            android:elevation="@dimen/fragment_list_element_background_elevation"
            android:layout_marginTop="@dimen/fragment_list_element_background_margin_top"
            android:layout_marginStart="@dimen/fragment_list_element_background_margin_start"
            android:layout_marginEnd="@dimen/fragment_list_element_background_margin_end"
            android:layout_marginBottom="@dimen/fragment_list_element_background_margin_bottom"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent">

        <ImageView
                android:id="@+id/fragment_list_element_image_view"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:src="@drawable/placeholder_image"
                android:contentDescription="@string/fragment_list_element_image_view_content_description"
                android:adjustViewBounds="true"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                tools:visibility="visible" />

        <androidx.constraintlayout.widget.ConstraintLayout
                android:id="@+id/fragment_list_element_text_view_group"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/fragment_list_element_textviews_margin_top"
                android:layout_marginStart="@dimen/fragment_list_element_textviews_margin_start"
                android:layout_marginEnd="@dimen/fragment_list_element_textviews_margin_end"
                android:layout_marginBottom="@dimen/fragment_list_element_textviews_margin_bottom"
                app:layout_constraintTop_toBottomOf="@id/fragment_list_element_image_view"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintBottom_toBottomOf="parent">

            <TextView
                    android:id="@+id/fragment_list_element_date"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/default_date_string"
                    android:textSize="@dimen/fragment_list_element_date_font_size"
                    android:textColor="@color/font_color_grey"
                    android:textAllCaps="true"
                    android:maxLines="1"
                    app:layout_constraintVertical_chainStyle="packed"
                    app:layout_constraintTop_toTopOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintBottom_toTopOf="@id/fragment_list_element_title" />

            <TextView
                    android:id="@+id/fragment_list_element_title"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/default_text"
                    android:textSize="@dimen/fragment_list_element_title_font_size"
                    android:textColor="@color/font_color_black"
                    android:textStyle="bold"
                    app:layout_constraintTop_toBottomOf="@id/fragment_list_element_date"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintBottom_toTopOf="@id/fragment_list_element_content" />

            <TextView
                    android:id="@+id/fragment_list_element_content"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/default_text"
                    android:textSize="@dimen/fragment_list_element_content_font_size"
                    android:textColor="@color/font_color_grey"
                    app:layout_constraintTop_toBottomOf="@id/fragment_list_element_title"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintBottom_toBottomOf="parent" />

        </androidx.constraintlayout.widget.ConstraintLayout>

    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

我的RecyclerViewAdapter中布局的膨胀。

import android.annotation.SuppressLint
import android.os.Build
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.RecyclerView
import my.project.R
import java.text.SimpleDateFormat

class MyListAdapter(private val elementList: List<Element>)
    : RecyclerView.Adapter<MyListAdapter.ViewHolder>() 

    class ViewHolder(view: View): RecyclerView.ViewHolder(view) 

        val background: ConstraintLayout = view.findViewById(R.id.news_list_element_background)
        val imageView: ImageView = view.findViewById(R.id.news_list_element_image_view)
        val date: TextView = view.findViewById(R.id.news_list_element_date)
        val title: TextView = view.findViewById(R.id.news_list_element_title)
        val content: TextView = view.findViewById(R.id.news_list_element_content)

    

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder 
        val itemView = LayoutInflater.from(parent.context).inflate(
            R.layout.fragment_list_element,
            parent,
            false
        )

        return ViewHolder(itemView)
    

    @SuppressLint("SimpleDateFormat")
    override fun onBindViewHolder(holder: ViewHolder, position: Int) 
        val element = elementList[position]

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
            holder.background.clipToOutline = true
        
        if (element.thumbnail != null) 
            holder.imageView.setImageBitmap(element.thumbnail)
            holder.imageView.visibility = View.VISIBLE
         else 
            holder.imageView.visibility = View.GONE
        
        holder.date.text = SimpleDateFormat("dd. MMMM yyyy").format(element.date)
        holder.title.text = element.title
        holder.content.text = element.content
    

    override fun getItemCount(): Int 
        return elementList.size
    


答案

有一个布局与 android:layout_height="match_parent" 直接在一个具有 android:layout_height="wrap_content" 似乎会导致这个问题。

为什么这不会产生一个构建错误,在膨胀过程中抛出一个RuntimeException,或者至少显示一个Lint警告,对我来说是个谜。

以上是关于在我的RecyclerView元素中,最后一个元素上下的边距不正确。的主要内容,如果未能解决你的问题,请参考以下文章

如何拖放 recyclerView 元素?

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

XML/android:如何为 RecyclerView 项目制作白色下划线? [复制]

如何在 RecyclerView 中显示 ArrayList? [复制]

滚动在RecyclerView中插入的项目

在 RecyclerView 中按组划分元素