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

如何在Kotlin+MVVM架构下实现RecyclerView数据加载与展示?

问题核心原因

  • 未将LiveData返回的实际数据传递给Adapter,仅调用notifyDataSetChanged不会更新Adapter内部的数据源列表
  • Adapter数据源设计错误,不需要存储MobileList列表,直接存储Product列表即可,原有索引逻辑还存在数组越界风险
  • 未给RecyclerView设置LayoutManager,缺少布局管理器的RecyclerView无法正常渲染条目

修正后代码

MainActivity

class MainActivity : AppCompatActivity() {
    lateinit var productViewModel: ProductViewModel
    private lateinit var binding: ActivityMainBinding

    val adapter = ProductAdapter()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        
        // 新增:给RecyclerView设置布局管理器
        binding.recyclerview.layoutManager = LinearLayoutManager(this)
        
        val productService = RetrofitHelper.getInstance().create(ProductService::class.java)

        val productRepository = ProductRepository(productService)
        productViewModel = ViewModelProvider(this, ProductViewModelFactory(productRepository)).get(ProductViewModel::class.java)

        binding.recyclerview.adapter = adapter
        productViewModel.products.observe(this,{
            Log.d("TEST",it.toString())
            // 新增:把返回的产品列表传递给Adapter更新数据
            adapter.setProducts(it.products)
        })
    }
}

ProductAdapter

class ProductAdapter : RecyclerView.Adapter<ProductViewHolder>() {
    // 改为直接存储Product列表
    private var products = mutableListOf<Product>()
    
    // 新增:对外暴露更新数据的方法
    fun setProducts(list: List<Product>) {
        products.clear()
        products.addAll(list)
        notifyDataSetChanged()
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProductViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        val binding = AdapterLayoutBinding.inflate(inflater, parent, false)
        return ProductViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ProductViewHolder, position: Int) {
        val product = products[position]
        holder.binding.name.text = product.name
        Glide.with(holder.itemView.context).load(product.image_url).into(holder.binding.imageview)
    }

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

}

class ProductViewHolder(val binding: AdapterLayoutBinding) : RecyclerView.ViewHolder(binding.root)

内容的提问来源于stack exchange,提问作者New Bee Andy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:51:01