gpt4 book ai didi

android - 嵌套的 RecyclerView 在第一次滚动后在项目之间添加空间

转载 作者:行者123 更新时间:2023-11-29 18:28:45 32 4
gpt4 key购买 nike

我正在尝试实现一个简单的嵌套 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>

recyclerview 的布局是:

<?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="match_parent"
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>

父级的适配器如下:

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)
}
}
}
}

而 child 的适配器是:

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))
}
}
}
}

第一次加载内容时,一切都正确显示如下:

initial state

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

state after scroll

recyclerviews 都没有添加任何item decoration。我的看法是,使用通用的 viewpool 至少会提高性能并有助于解决此类布局不一致问题,但它并没有帮助。

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

最佳答案

您需要更改recyclerview 子布局的高度 到 android:layout_height="wrap_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>

关于android - 嵌套的 RecyclerView 在第一次滚动后在项目之间添加空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57492066/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com