如何从Adapter将ModelList(ArrayList)传递到Activity并更新对应位置RecyclerView数据
商品列表弹窗选中数据回传更新实现方案
以下是针对该场景的可落地实现步骤:
核心实现逻辑
通过接口回调完成弹窗到Activity的数据传递,定位到列表对应位置后刷新局部item即可。
步骤1:定义回调接口
在弹窗类内部定义数据回调接口,同时支持传入商品在列表中的位置下标/唯一ID:
// 弹窗类内部定义接口 interface OnVariantSelectListener { // 参数可根据你的实际业务调整,这里传入选中的变体数据+商品定位标识 fun onVariantSelected(variant: ProductVariant, productPosition: Int) }
在弹窗类中新增监听器设置方法,同时创建弹窗实例时将点击的商品位置/ID传入弹窗内部保存。
步骤2:弹窗内触发回调
在弹窗内部的变体列表RecyclerView的item点击事件中,拿到选中的变体数据后触发回调:
// 弹窗内变体列表item点击逻辑 variantAdapter.setOnItemClickListener { selectedVariant -> selectListener?.onVariantSelected(selectedVariant, savedProductPosition) dismiss() }
步骤3:Activity接收数据更新列表
在Activity中初始化弹窗时设置回调监听器,接收到回传数据后更新列表数据源对应位置的内容,再调用局部刷新方法更新列表:
// Activity中创建弹窗并设置回调 val selectDialog = ProductVariantSelectDialog(this, clickedProductPosition) selectDialog.setOnVariantSelectListener { variant, position -> // 更新列表数据源对应位置的商品数据 productList[position].selectedVariant = variant // 仅刷新对应位置item,避免整页刷新导致的性能问题和闪烁 productListAdapter.notifyItemChanged(position) } selectDialog.show()
注意:如果你的商品列表有筛选、排序、删除等动态变更场景,建议使用商品唯一ID而非位置下标做数据匹配,避免下标错位导致更新到错误的商品项。
可选实现方案(适配Jetpack架构)
如果项目引入了Jetpack ViewModel组件,可直接使用共享ViewModel实现数据传递:
- Activity和弹窗共享同一个
SharedViewModel实例 - 弹窗内选中变体后更新ViewModel中的
selectedVariantEvent可观察数据 - Activity中观察该数据,收到更新后匹配对应商品位置刷新列表即可,无需定义额外接口。
内容的提问来源于stack exchange,提问作者Shubham Gupta
相关产品推荐
相关产品推荐

