1

我正在尝试实现一个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)
            }
        }
    }
}

而儿童的适配器是:

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

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

初始状态

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

滚动后的状态

没有一个recyclerviews有任何item decoration添加到他们。我的看法是,使用 commonviewpool至少会提高性能并有助于解决这种布局不一致的问题,但它并没有帮助。

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

4

1 回答 1

2

您需要将子布局的高度更改 recyclerviewandroid: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>
于 2019-08-14T09:38:25.583 回答