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

同一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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:06:01