我有带有内部支架类的简单适配器。
我尝试以这种方式在项目点击监听器上实现,但它不起作用:
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)
}
}
我知道第二个代码为什么起作用,但是有人可以解释一下,为什么我的第一个代码不起作用吗?有什么区别?
答案 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