You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:40:37