如何仅使用一个LiveData列表承载实现相同接口的不同类实例
可行实现方案如下,这是目前最优的处理方式:
1. 首先修改ViewModel逻辑,新增按类型加载过滤列表的方法
你可以选择是否缓存已加载的列表:如果需要保留用户在不同过滤器类型下的选中状态,就加缓存逻辑;不需要的话可以去掉缓存,每次直接生成新列表即可。
// 可选:添加类型限定注解,避免传参错误 @IntDef(SKILLS, PROJECTS) @Retention(AnnotationRetention.SOURCE) annotation class FilterType class FilterViewModel : ViewModel() { // 可选:缓存不同类型的过滤列表,保留选中状态 private val filterCache = mutableMapOf<Int, List<FilterItem>>() private val _filterList = MutableLiveData<List<FilterItem>>() val filterList: LiveData<List<FilterItem>> = _filterList // 对外暴露的加载方法,根据传入的类型返回对应的过滤列表 fun loadFilterList(@FilterType type: Int) { viewModelScope.launch { _filterList.value = filterCache.getOrPut(type) { when (type) { SKILLS -> loadSkills() PROJECTS -> loadProjects() else -> emptyList() } } } } // 原有的loadSkills、loadProjects方法保留即可 private fun loadSkills(): MutableList<FilterItem> { val technologiesList: MutableList<FilterItem> = mutableListOf() technologiesList.add(Technology("1", "Android")) technologiesList.add(Technology("2", "Kotlin")) return technologiesList } private fun loadProjects(): MutableList<FilterItem> { val projectsList: MutableList<FilterItem> = mutableListOf() projectsList.add(Project("1", "Project 1")) projectsList.add(Project("2", "Project 2")) return projectsList } }
2. 修改UI层的点击逻辑,调用上述方法切换列表
showSkillsButton.setOnClickListener { filterViewModel.loadFilterList(SKILLS) showFilterModal(filterViewModel.filterList, SKILLS) } showProjectsButton.setOnClickListener { filterViewModel.loadFilterList(PROJECTS) showFilterModal(filterViewModel.filterList, PROJECTS) }
注意事项
如果你的列表数据是从网络/数据库异步加载的,建议在UI层观察filterList的变化,收到新数据后再弹出BottomSheetDialog,避免弹窗显示后数据还没更新的问题。
内容的提问来源于stack exchange,提问作者Ciprian
相关产品推荐
相关产品推荐

