内部类上的View.OnClickListener插入Adapter不起作用

时间:2019-05-18 09:13:35

标签: android kotlin onclicklistener

我有带有内部支架类的简单适配器。

我尝试以这种方式在项目点击监听器上实现,但它不起作用:

class ThemeAdapter(private val callback: (position: Int) -> Unit) : RecyclerView.Adapter<ThemeAdapter.ThemeHolder>() {

    private lateinit var themeList: Array<String>

    override fun getItemCount(): Int {
        return themeList.size
    }

    fun setThemes(themes: Array<String>) {
        themeList = themes
        notifyDataSetChanged()
    }

    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ThemeHolder {
        val inflater = LayoutInflater.from(viewGroup.context)
        return ThemeHolder(inflater.inflate(R.layout.cell_library_themes, viewGroup, false))
    }

    override fun onBindViewHolder(holder: ThemeHolder, position: Int) {
        holder.bind(themeList[position])
    }

    inner class ThemeHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
        private var theme: TextView = itemView.spinner_library_dropdown

        fun bind(themeName: String) {
            theme.text = themeName
        }

        override fun onClick(v: View?) {
            Timber.e("OnClick!")
            callback.invoke(adapterPosition) 
        }
    }
}

木材什么也没记录。

修复很简单:

fun bind(themeName: String) {
            theme.text = themeName
            itemView.setOnClickListener {
                Timber.e("OnClick!")
                callback.invoke(adapterPosition)
            }
        }

我知道第二个代码为什么起作用,但是有人可以解释一下,为什么我的第一个代码不起作用吗?有什么区别?

2 个答案:

答案 0 :(得分:0)

尝试一下:在您的适配器类中

lateinit var mClickHandler: MyAdapterOnClickHandler

interface MyAdapterOnClickHandler {
    fun onClick(view: View, position: Int)
}

fun setOnClickHandler(myAdapterOnClickHandler: MyAdapterOnCLickHandler){
    mClickHandler = myAdapterOnClickHandler
}

在您的Viewholder中:

init {
    itemView.setOnClickListener(this)
}

override fun onClick(v: View?) {
    mClickHandler.onClick(itemView, adapterPosition)
}

您的活动或片段需要实现MyAdapter.MyAdapterOnClickHandler 在您的活动中:

//in onCreate 
adapter = MyAdapter(this)
adapter.setOnClickListener(this)

// then override the onclick
override fun onCLick(view: View, position: Int) {
   Log.d(LOGTAG, "clicked! $position")
}

答案 1 :(得分:0)

只需将实现View.OnClickListener的ViewHolder绑定到ViewHolder.itemView

fun bind(themeName: String) {
    itemView.setOnClickListener(this)
    theme.text = themeName
}

您刚刚从View.OnClickListener接口中实现了所需的方法,但是您没有在任何地方使用它(在代码段中只是未使用的方法)。 Android不知道它是View,因为它实现了其界面。

在Java中为您工作的代码如下:

itemView.setOnClickListener(new View.OnClickListener() {
    Timber.e("OnClick!");
    callback.invoke(adapterPosition);
});

其他不起作用

itemView.setOnClickListener(null); // therefore it doesn't work for you
// cause your itemView doesn't have any listener