Android 嵌套回收视图在第一次滚动后在项目之间添加空间

Android 嵌套回收视图在第一次滚动后在项目之间添加空间,android,android-recyclerview,nestedrecyclerview,Android,Android Recyclerview,Nestedrecyclerview,我正在尝试实现一个简单的嵌套recyclerview,其中包含一个垂直的父级和水平的子级 父级的布局为: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/parentLayout" android:layout_width="match_parent"

我正在尝试实现一个简单的嵌套
recyclerview
,其中包含一个垂直的父级和水平的子级

父级的布局为:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/parentLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp">

    <include layout="@layout/loading_indicator" />

    <include layout="@layout/error_layout" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/podcasts"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/podcastsTitle"
        android:layout_marginTop="5dp" />
</RelativeLayout>
父级的适配器如下所示:

class CuratedPodcastsAdapter(val context: Context, private val podcastLists: ArrayList<PodcastList>) : RecyclerView.Adapter<CuratedPodcastsAdapter.ViewHolder>() {

    private val viewPool = RecyclerView.RecycledViewPool()

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

    override fun getItemCount(): Int = podcastLists.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bindItems(podcastLists[holder.adapterPosition])
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        @BindView(R.id.title)
        lateinit var title: TextView
        @BindView(R.id.description)
        lateinit var description: TextView
        @BindView(R.id.podcastsItems)
        lateinit var podcastItems: RecyclerView

        init {
            ButterKnife.bind(this, itemView)
        }

        fun bindItems(curatedPodcastList: PodcastList) {
            title.text = curatedPodcastList.title
            description.text = curatedPodcastList.description

            title.typeface = FontUtils.boldTypeface
            description.typeface = FontUtils.mediumTypeface

            val childLayoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
            childLayoutManager.initialPrefetchItemCount = 4

            podcastItems.apply {
                layoutManager = childLayoutManager
                adapter = PodcastAdapter(this@CuratedPodcastsAdapter.context, curatedPodcastList.podcasts!!)
                setItemViewCacheSize(20)
                setRecycledViewPool(viewPool)
            }
        }
    }
}
class-CuratedPodcastAdapter(val-context:context,private-val-PodcastList:ArrayList):RecyclerView.Adapter(){
private val viewPool=RecyclerView.RecycledViewPool()
覆盖fun onCreateViewHolder(父级:ViewGroup,viewType:Int):ViewHolder=ViewHolder(LayoutFlater.from(父级。上下文)。充气(R.layout.podcast\u section\u layout,父级,false))
重写fun getItemCount():Int=podcastLists.size
覆盖BindViewHolder(holder:ViewHolder,位置:Int){
holder.bindItems(播客列表[holder.adapterPosition])
}
内部类ViewHolder(itemView:View):RecyclerView.ViewHolder(itemView){
@BindView(R.id.title)
lateinit变量标题:TextView
@BindView(R.id.description)
lateinit变量说明:TextView
@BindView(R.id.podcastsItems)
lateinit var podcastItems:RecyclerView
初始化{
ButterKnife.bind(此,itemView)
}
娱乐项目(策划播客列表:播客列表){
title.text=curatedPodcastList.title
description.text=curatedPodcastList.description
title.typeface=FontUtils.boldTypeface
description.typeface=FontUtils.mediumTypeface
val childLayoutManager=LinearLayoutManager(上下文,LinearLayoutManager.HORIZONTAL,false)
childLayoutManager.initialPrefetchItemCount=4
podcastItems.apply{
layoutManager=childLayoutManager
适配器=PodcastAdapter(this@CuratedPodcastsAdapter.context,策展播客列表。播客!!)
setItemViewCacheSize(20)
setRecycledViewPool(viewPool)
}
}
}
}
而儿童适配器是:

class PodcastAdapter(val context: Context, private val episodes: ArrayList<Podcast>): RecyclerView.Adapter<PodcastAdapter.ViewHolder>() {

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

    override fun getItemCount(): Int = episodes.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bindItems(episodes[holder.adapterPosition])
    }

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

        @BindView(R.id.art)
        lateinit var art: ImageView
        @BindView(R.id.title)
        lateinit var title: TextView
        @BindView(R.id.publisher)
        lateinit var publisher: TextView
        @BindView(R.id.card)
        lateinit var card: CardView

        init {
            ButterKnife.bind(this, view)
        }

        fun bindItems(podcast: Podcast){
            title.text = podcast.title
            publisher.text = podcast.publisher
            GlideApp.with(context).load(podcast.image).error(R.drawable.no_cover).into(art)

            card.setOnClickListener {
                context.startActivity(context.intentFor<PodcastActivity>(PodcastActivity.PODCAST_ID to podcast.id, PodcastActivity.PODCAST_TITLE to podcast.title))
            }
        }
    }
}
class PodcastAdapter(val上下文:context,private val剧集:ArrayList):RecyclerView.Adapter(){
覆盖fun onCreateViewHolder(父级:ViewGroup,viewType:Int):ViewHolder=ViewHolder(LayoutFlater.from(父级.context)。充气(R.layout.podcast\u item\u layout,父级,false))
覆盖有趣的getItemCount():Int=scents.size
覆盖BindViewHolder(holder:ViewHolder,位置:Int){
holder.bindItems(剧集[holder.adapterPosition])
}
内部类ViewHolder(视图:视图):RecyclerView.ViewHolder(视图){
@BindView(R.id.art)
lateinit变量艺术:ImageView
@BindView(R.id.title)
lateinit变量标题:TextView
@BindView(R.id.publisher)
lateinit变量发布者:TextView
@BindView(R.id.card)
lateinit var卡:CardView
初始化{
ButterKnife.绑定(此,视图)
}
趣味项目(播客:播客){
title.text=podcast.title
publisher.text=podcast.publisher
GlideApp.with(context).load(podcast.image).error(R.drawable.no_cover).into(艺术)
card.setOnClickListener{
context.startActivity(context.intentFor(PodcastActivity.PODCAST_ID到PODCAST.ID,PodcastActivity.PODCAST_TITLE到PODCAST.TITLE))
}
}
}
}
首次加载内容时,所有内容都正确显示,如下所示:

向下滚动然后再次向上滚动后,内容之间开始出现空格,如下所示:

所有
recyclerviews
都没有添加任何
项目装饰。我的看法是,使用通用的
视图池
至少可以提高性能,有助于解决此类布局不一致的问题,但没有起到任何作用


此问题的原因是什么?如何解决此问题?

您需要更改<代码>回收视图
到android:layout\u height=“wrap\u content”

示例代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:orientation="vertical">

    <TextView
        android:id="@+id/title"
        style="@style/TitleTextStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="3dp"
        android:textAppearance="@style/TextAppearance.AppCompat.Large" />

    <TextView
        android:id="@+id/description"
        style="@style/AuxTextStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="5dp"
        android:maxLines="2"
        android:textAppearance="@style/TextAppearance.AppCompat.Medium" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/podcastsItems"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

老实说,我不知道我是怎么错过的。它起作用了。非常感谢你!
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:orientation="vertical">

    <TextView
        android:id="@+id/title"
        style="@style/TitleTextStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="3dp"
        android:textAppearance="@style/TextAppearance.AppCompat.Large" />

    <TextView
        android:id="@+id/description"
        style="@style/AuxTextStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="5dp"
        android:maxLines="2"
        android:textAppearance="@style/TextAppearance.AppCompat.Medium" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/podcastsItems"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>