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

使用RecyclerView展示远程服务器数据时遇movieList为空问题

问题分析与解决方案

你遇到的核心问题有两个:数据类类型不匹配,以及Adapter缺少数据更新的正确逻辑,导致拿到服务器响应后movieList依然为null。

1. 修复数据类类型不匹配

你的Adapter中声明的是ArrayList<MovieDetailResponse>?,但提供的数据类却是Put,两者类型完全不匹配,这会导致你无法将解析后的服务器数据赋值给Adapter的movieList。

解决方法:

  • 要么把Adapter中的movieList类型改为List<Put>,
  • 要么把数据类Put重命名为MovieDetailResponse,保持类型一致。

2. 给Adapter添加正确的数据更新方法

当前Adapter没有提供设置数据的入口,且movieList被声明为可空类型,容易出现null值问题。建议改为非空初始化,并添加专门的数据更新方法:

修改后的Adapter代码:

class Adapter : RecyclerView.Adapter<MovieListViewHolder>() {

    // 用非空List初始化,避免null问题,类型和数据类保持一致
    private var movieList: List<Put> = emptyList()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MovieListViewHolder {
        return MovieListViewHolder(parent)
    }

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

    override fun onBindViewHolder(holder: MovieListViewHolder, position: Int) {
        // 无需空安全判断,因为movieList初始化为emptyList
        holder.bind(movieList[position])
    }

    // 添加数据更新方法,调用notifyDataSetChanged通知列表刷新
    fun setData(newMovies: List<Put>) {
        movieList = newMovies
        notifyDataSetChanged()
        // 如果数据量较大,建议使用DiffUtil提升性能,替换notifyDataSetChanged
    }
}

3. 在拿到服务器响应后更新Adapter数据

当你从服务器拿到解析好的数据列表后,调用Adapter的setData方法传入数据:

// 假设这是你解析后的服务器返回数据
val fetchedMovies: List<Put> = 你的解析逻辑()
// 调用Adapter的方法更新数据
adapter.setData(fetchedMovies)

额外建议

  • 数据类Put命名不合理,建议改为MovieDetailResponse,增强代码可读性;
  • 如果需要更高效的列表刷新,可使用DiffUtil替代notifyDataSetChanged(),避免全量刷新。

内容的提问来源于stack exchange,提问作者S.irmak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 08:55:28