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