Android:为什么自定义微调器的getView被多次调用

问题描述 投票:0回答:1

我制作了 3 个下拉旋转器并制作了旋转器适配器,并为每个旋转器设置了 setAdapters。但问题是,当我点击下拉Spinner项时,我从Spinner Adapters的getView调用到另一个Spinner,但我不知道为什么。

private fun initSeriesSpinner() {
        val series = resources.getStringArray(R.array.selectedSeriesList)
        val listOfSeries = ArrayList(mutableListOf(*series))

        spinnerSeriesAdapter =
            MonkeySpinnerViewAdapter(requireContext(), 0, listOfSeries)

        binding.spinnerSeries.adapter = spinnerSeriesAdapter
    }

    private fun initTypeSpinner() {
        val types = resources.getStringArray(R.array.selectedSeriesList)
        val listOfSeries = ArrayList(mutableListOf(*types))

        with(binding) {
            spinnerType.buildCheckedSpinner(listOfSeries) { selectedPositionList, displayString ->

            }
        }
    }

    private fun initCompareSpinner() {
        val types = resources.getStringArray(R.array.testList)
        val listOfSeries = ArrayList(mutableListOf(*types))

        binding.spinnerCompare.adapter = MonkeySpinnerViewAdapter(requireContext(), 0, listOfSeries)
    }
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val binding: ItemMultiSpinnerGetviewBinding = if (convertView == null) {
            /*Log.d("TEST","check_getView")
            Log.d("TEST","position =  $position")*/
            Log.d("TESt",">  // hashCode = ${this.hashCode()}")
            ItemMultiSpinnerGetviewBinding.inflate(LayoutInflater.from(context), parent, false)
                .also {
                    it.root.tag = it
                }
        } else {
            convertView.tag as ItemMultiSpinnerGetviewBinding
        }

        binding.tvBeforeClickedMultiSpinner.text = dataList[position].text

        return binding.root
    }
if (isDataChanged) {
    checkedListener(dataList, position)
    notifyDataSetChanged()
}

我尝试解决的方法是因为资源文件是一样的,所以我新建了一个数组对象放进去,我以为是因为我使用了同一个Spinner Adapter类,所以我单独做了一个类,但它被一起调用了。

java android kotlin spinner
1个回答
0
投票

确保您在 getView 方法中使用 ViewHolder 模式。该模式用于有效地回收视图。如果您不使用它,请考虑像这样修改您的 getView 方法:

override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
    val binding: ItemMultiSpinnerGetviewBinding
    if (convertView == null) {
        val inflater = LayoutInflater.from(context)
        binding = ItemMultiSpinnerGetviewBinding.inflate(inflater, parent, false)
        binding.root.tag = binding
    } else {
        binding = convertView.tag as ItemMultiSpinnerGetviewBinding
    }

    binding.tvBeforeClickedMultiSpinner.text = dataList[position].text

    return binding.root
}

避免在 getView 中调用 notifyDataSetChanged()。通常不建议这样做,并且可能会导致意外行为。相反,当您想要通知适配器底层数据已更改时,请在 getView 方法之外使用它。

在您的情况下,从 getView 方法中删除 notificationDataSetChanged() 调用。

© www.soinside.com 2019 - 2024. All rights reserved.