使用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
相关产品推荐
相关产品推荐

