Android Kotlin嵌套RecyclerView展示多JSON数组问题
Android Kotlin 嵌套RecyclerView实现方案
针对你已完成JSON解析但嵌套RecyclerView展示遇阻的情况,下面是具体实现步骤:
1. 统一数据结构
你的JSON中部分分类是单个对象(如featured),部分是数组,先把所有分类数据统一成分类标题+内容列表的结构,方便RecyclerView统一处理:
// 定义系列数据模型(根据你实际解析的类调整,示例保留核心字段) data class SeriesItem( val id: Int, val name: String, val poster: String, val description: String ) // 定义分类数据模型,每个分类包含标题和对应的系列列表 data class Category( val title: String, val seriesList: List<SeriesItem> )
将解析后的JSON数据转换为List<Category>:
// 假设你已解析得到各分类数据,示例如下: val featuredItem = // 解析后的featured对象 val continueWatchingList = // 解析后的continueWatching数组 val recommendedList = // 解析后的recommended数组 // 构建分类列表 val categoryList = mutableListOf<Category>().apply { add(Category("Featured", listOf(featuredItem))) add(Category("Continue Watching", continueWatchingList)) add(Category("Recommended", recommendedList)) // 其他分类如Trailers、All Series、Malayalam等依次添加 }
2. 实现子RecyclerView Adapter
子Adapter负责展示每个分类下的横向滚动系列项:
class SeriesAdapter(private val seriesList: List<SeriesItem>) : RecyclerView.Adapter<SeriesAdapter.SeriesViewHolder>() { inner class SeriesViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val posterIv: ImageView = itemView.findViewById(R.id.iv_poster) val nameTv: TextView = itemView.findViewById(R.id.tv_name) // 按需添加其他控件 } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SeriesViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_series, parent, false) return SeriesViewHolder(view) } override fun onBindViewHolder(holder: SeriesViewHolder, position: Int) { val item = seriesList[position] holder.nameTv.text = item.name // 用Glide/Coil加载海报图片 // Glide.with(holder.posterIv.context).load(item.poster).into(holder.posterIv) } override fun getItemCount() = seriesList.size }
子项布局item_series.xml示例:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="180dp" android:layout_height="wrap_content" android:orientation="vertical" android:padding="8dp"> <ImageView android:id="@+id/iv_poster" android:layout_width="match_parent" android:layout_height="240dp" android:scaleType="centerCrop" android:background="@color/gray"/> <TextView android:id="@+id/tv_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:textSize="14sp" android:textColor="@color/black"/> </LinearLayout>
3. 实现父RecyclerView Adapter
父Adapter负责展示每个分类的标题和对应的子RecyclerView:
class CategoryAdapter(private val categoryList: List<Category>) : RecyclerView.Adapter<CategoryAdapter.CategoryViewHolder>() { inner class CategoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val titleTv: TextView = itemView.findViewById(R.id.tv_category_title) val childRv: RecyclerView = itemView.findViewById(R.id.rv_child) init { // 初始化子RecyclerView的横向布局 childRv.layoutManager = LinearLayoutManager(itemView.context, LinearLayoutManager.HORIZONTAL, false) // 关闭嵌套滚动优化性能 childRv.isNestedScrollingEnabled = false } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CategoryViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_category, parent, false) return CategoryViewHolder(view) } override fun onBindViewHolder(holder: CategoryViewHolder, position: Int) { val category = categoryList[position] holder.titleTv.text = category.title // 设置子RecyclerView的Adapter holder.childRv.adapter = SeriesAdapter(category.seriesList) } override fun getItemCount() = categoryList.size }
父项布局item_category.xml示例:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="16dp"> <TextView android:id="@+id/tv_category_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:textStyle="bold" android:textColor="@color/black" android:layout_marginBottom="12dp"/> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_child" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
4. 在Activity/Fragment中绑定数据
最后在页面中初始化父RecyclerView并设置Adapter:
// Activity示例代码 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val parentRv: RecyclerView = findViewById(R.id.rv_parent) parentRv.layoutManager = LinearLayoutManager(this) parentRv.adapter = CategoryAdapter(categoryList) // categoryList为步骤1中构建的列表 } }
主布局activity_main.xml示例:
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rv_parent" android:layout_width="match_parent" android:layout_height="match_parent"/>
注意事项
- 图片加载建议用Glide或Coil等第三方库,避免内存溢出
- 子RecyclerView设置
isNestedScrollingEnabled = false可提升滚动流畅度 - 若分类数据较多,建议给父Adapter添加DiffUtil优化更新效率
内容的提问来源于stack exchange,提问作者swaroop
相关产品推荐
相关产品推荐

