android 嵌套的垂直RecyclerView不显示所有内容,如果子RecyclerView是水平的,则有效

dm7nw8vv  于 2023-03-21  发布在  Android
关注(0)|答案(1)|浏览(289)

我有以下需求-一个列表的垂直RecyclerView,它包含一个TextView和一个列表的子垂直RecyclerView。这些数据来自一个API。问题是内部RV不滚动,也不显示所有项目,只显示前4个左右。理想情况下,我希望子RV显示所有项目。有趣的是,如果我使子RV水平,这个问题就消失了。我可以完全滚动并查看所有项目。
我有以下实现。
母体

class TitlesAdapter(
private val titlesList: List<Title>,
private val articlesList: List<Article>
): RecyclerView.Adapter<TitlesAdapter.Holder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
    val binding = TitlesBinding.inflate(LayoutInflater.from(parent.context),parent,false)
    return TitlesBinding.Holder(binding)
}

override fun onBindViewHolder(holder: Holder, position: Int) {
    val itemRow = categoryList.get(position)
    holder.bindRow(itemRow, articlesList)
}

override fun getItemCount(): Int {
    return categoryList.size
}

class Holder(var binding: TitlesBinding): RecyclerView.ViewHolder(binding.root){

  
    fun bindRow(
        title: Title,
        articles: List<Article>
    ) {
            binding.tvTitleName.text = title.name
        val filteredList = articles.filter { it.category == title.id }

        binding.rvChild.adapter = ChildRVAdapter(filteredList)
        binding.rvChild.layoutManager = LinearLayoutManager(itemView.context)
      
    }
}
}

子RV适配器:

class ChildRVAdapter(private val articleList: List<Article>): RecyclerView.Adapter<ChildRVAdapter.Holder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
    val binding = RowArticleBinding.inflate(LayoutInflater.from(parent.context),parent,false)
    return RowArticleBinding.Holder(binding)
}

override fun onBindViewHolder(holder: Holder, position: Int) {
    val itemRow = articleList.get(position)
    holder.bindRow(itemRow)
}

override fun getItemCount(): Int {
    return articleList.size
}

class Holder(var binding: RowArticleBinding): RecyclerView.ViewHolder(binding.root), View.OnClickListener{

    fun bindRow(
        article: Article
    ) {
        binding.tvTitle.text = article.title
        binding.tvDesc.text = article.description
    }
}
}

父RV的xml如下所示:

<?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:orientation="vertical">
<TextView
    android:id="@+id/tv_title_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="20sp"
    android:textColor="@color/textBlack"
    android:fontFamily="@font/playfair_bold"
    android:layout_marginBottom="18dp"
    android:text="Introduction"/>
<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/rv_child"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
</LinearLayout>

以及子RV的XML:

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

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Introduction from Annabel Karmel"
        android:textColor="@color/textBlack"
        android:textSize="14sp"
        android:fontFamily="@font/montserrat_bold"/>
    <TextView
        android:id="@+id/tv_desc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/dustyGrey"
        android:layout_marginTop="6dp"
        android:textSize="14sp"
        android:fontFamily="@font/montserrat_medium"/>
</LinearLayout>
n9vozmp4

n9vozmp41#

据猜测,这是因为父列表的项具有固定的高度match_parent(即,无论父RecyclerView碰巧占据什么高度),而子RV的高度是wrap_content,即,“与显示其所有内容而不滚动所需的一样高”。因此,子RV将一次显示所有内容,但除了前4个项目外,所有项目都显示在屏幕底部-您可以在应用运行时使用布局检查器来查看正在发生的事情。
具有可滚动内容(例如RecyclerView s,ScrollView s等)您需要将容器的高度限制在您想要显示内容的“窗口”内。如果内容大于该窗口,则它将滚动。通常您想要滚动的轴上的wrap_content是错误的,因为它会阻止它滚动!而且你最终会得到一个很大的视图,它太大而不能完全显示。
因此,parent RV 文件中的RecyclerView应该有一个约束高度,就像LinearLayout中的0dplayout_weight="1"一样,这样它就可以填充其父布局中的剩余可用空间。这样,如果它的内容太大,它将保持固定大小并滚动,而不是扩展。

相关问题