我制作了 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类,所以我单独做了一个类,但它被一起调用了。
确保您在 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() 调用。