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>