在项目选择的侦听器上初始化(自定义微调器适配器)

Posted

技术标签:

【中文标题】在项目选择的侦听器上初始化(自定义微调器适配器)【英文标题】:Initializing on item selected listener (Custom Spinner Adapter) 【发布时间】:2020-10-22 14:06:45 【问题描述】:

我创建了一个自定义微调器适配器,它返回两个视图(item_new_area 和 item_area),item_new_area 是静态的,带有添加新选项和 item_area 填充动态。

When Add new is selected,I want to launch the dialog for add new area but i keep on getting an error that lateinit property listener has not been initialized

自定义微调器适配器

class AreaSpinnerAdapter(private val inflater: LayoutInflater) : BaseAdapter() 
var areas: List<AreaEntity>? = null
lateinit var listener: OnItemSelectedListener

override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View 

    return when (getItemViewType(position)) 
        1 -> 
            val binding: ItemNewAreaBinding = DataBindingUtil.inflate<ItemNewAreaBinding>(
                inflater,
                R.layout.item_new_area,
                parent, false
            ).also 
                it.root.tag = it
            

            binding.addNew.setOnClickListener 
                listener.onClick()

            
            binding.root
        
        else -> 
            val binding: ItemAreaBinding = DataBindingUtil.inflate<ItemAreaBinding>(
                inflater,
                R.layout.item_area,
                parent, false
            ).also 
                it.root.tag = it
            
            binding.area = getItem(position)
            binding.root
        
    


override fun getItemViewType(position: Int): Int 
    return if (position == 1) 
        1
     else 
        2
    


fun setOnItemClickListener(listener: OnItemSelectedListener) 
    this.listener = listener



interface OnItemSelectedListener 
    fun onClick()

我尝试在片段的 onCreateView 方法中设置 on Item Clicked 监听器:

val spinnerAdapter = AreaSpinnerAdapter(layoutInflater)
    spinnerAdapter.setOnItemClickListener(object :
        AreaSpinnerAdapter.OnItemSelectedListener 
        override fun onClick() 
            addNewAreaDialog()
        
    )

    binding?.spinnerArea?.adapter = spinnerAdapter

错误日志

 kotlin.UninitializedPropertyAccessException: lateinit property listener has not been initialized
    at com.test.adapter.AreaSpinnerAdapter.getListener(AreaSpinnerAdapter.kt:15)
    at com.test.adapter.AreaSpinnerAdapter$getView$1.onClick(AreaSpinnerAdapter.kt:50)

第 15 行 = lateinit var 侦听器:OnItemSelectedListener

第 25 行 = listener.onClick()

我知道我应该在调用 getView 方法之前初始化侦听器,但由于某些原因未能初始化侦听器,任何有关如何执行此操作的帮助将不胜感激。谢谢

【问题讨论】:

【参考方案1】:

您需要将侦听器AreaSpinnerAdapter 移动到构造函数中。

class AreaSpinnerAdapter(
    private val inflater: LayoutInflater,
    private val listener: OnItemSelectedListener
        ) : BaseAdapter() 
    var areas: List<AreaEntity>? = null

然后像这样称呼它

val spinnerAdapter = AreaSpinnerAdapter(layoutInflater, 
object: AreaSpinnerAdapter.OnItemSelectedListener 
    override fun onClick() 
        addNewAreaDialog()
    
)

【讨论】:

当我这样做时,我得到红线说接口 OnItemSelectedListener 没有构造函数。 谢谢@Max,您的解决方案很有魅力:实际上我还发现我的代码运行良好。在 onCreatView 函数中的这一行 [ val spinnerAdapter = AreaSpinnerAdapter(layoutInflater) ] 上方初始化侦听器之前,我不小心将适配器设置为微调器。删除后效果很好。 谢谢。这行得通。但是我的微调器对话框在项目点击后没有关闭。请问您也可以提供一些解决方案吗?

以上是关于在项目选择的侦听器上初始化(自定义微调器适配器)的主要内容,如果未能解决你的问题,请参考以下文章

OnItemClickListener() 用于列表视图的每个项目中的微调器

spinner android kotlin 的自定义适配器不可见,但在单击下拉值时可见

如何在 ionic 3 应用程序启动画面上设置自定义微调器

在 Android 中动态禁用微调器项目

Android:如何将微调器绑定到自定义对象列表?

Spinner - 关注第一个项目