同一Fragment中使用相同ArrayList为两个Spinner填充不同内容的实现问题
同一数据源给两个Spinner展示不同字段的实现方法
核心原因是默认ArrayAdapter会调用数据类的toString()方法渲染显示文本,你当前重写的toString()返回productType,所以第一个Spinner展示符合预期,第二个要展示productGroup可以用以下两种方案实现:
方案一:自定义ArrayAdapter(推荐)
该方案保留完整的数据源对象,Spinner选中条目后可直接获取对应的ProductTypeObject实例,无需额外做数据匹配,适配后续复杂业务逻辑。
首先实现自定义适配器:
// 自定义适配器,指定渲染productGroup字段 class ProductGroupAdapter(context: Context, resource: Int, objects: List<ProductTypeObject>) : ArrayAdapter<ProductTypeObject>(context, resource, objects) { // 控制Spinner折叠状态的显示文本 override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { val view = super.getView(position, convertView, parent) val item = getItem(position) (view as TextView).text = item?.productGroup ?: "" return view } // 控制Spinner展开下拉列表的显示文本 override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View { val view = super.getDropDownView(position, convertView, parent) val item = getItem(position) (view as TextView).text = item?.productGroup ?: "" return view } }
修改原有数据观察代码,同时给两个Spinner设置适配器:
businessViewModel.allAppDataProductTypes.observe(viewLifecycleOwner, Observer { productTypeArrayList -> if (!productTypeArrayList.isNullOrEmpty()){ // 第一个Spinner沿用原有逻辑,展示productType val productTypeAdapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, productTypeArrayList) productTypeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) binding.inventoryAddEditProductTypeSpinner.adapter = productTypeAdapter // 第二个Spinner用自定义适配器,展示productGroup val productGroupAdapter = ProductGroupAdapter(requireContext(), android.R.layout.simple_spinner_item, productTypeArrayList) productGroupAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) binding.inventoryAddEditProductGroupSpinner.adapter = productGroupAdapter } })
方案二:映射生成新的字符串列表
如果不需要在选中时获取完整的ProductTypeObject对象,仅需要productGroup的文本值,可以直接从原数据源提取对应字段生成新列表给第二个Spinner使用:
businessViewModel.allAppDataProductTypes.observe(viewLifecycleOwner, Observer { productTypeArrayList -> if (!productTypeArrayList.isNullOrEmpty()){ // 第一个Spinner逻辑不变 val productTypeAdapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, productTypeArrayList) productTypeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) binding.inventoryAddEditProductTypeSpinner.adapter = productTypeAdapter // 提取所有productGroup生成新列表,如需去重可追加.distinct() val productGroupList = productTypeArrayList.map { it.productGroup } val productGroupAdapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, productGroupList) productGroupAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) binding.inventoryAddEditProductGroupSpinner.adapter = productGroupAdapter } })
注意事项
- 两种方案都不需要修改原有
ProductTypeObject的toString()方法,不会影响第一个Spinner的显示逻辑 - 如果需要对第二个Spinner的
productGroup去重,可在映射列表时添加distinct()方法:productTypeArrayList.map { it.productGroup }.distinct()
内容的提问来源于stack exchange,提问作者Scamparelli
相关产品推荐
相关产品推荐

