如何在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
相关产品推荐
相关产品推荐

