【问题标题】:View.OnClickListener on inner class into Adapter is't work内部类上的 View.OnClickListener 进入适配器不起作用
【发布时间】:2019-05-18 09:13:35
【问题描述】:

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

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

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)
            }
        }

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

【问题讨论】:

    标签: android kotlin onclicklistener


    【解决方案1】:

    试试这个:在你的适配器类中

    lateinit var mClickHandler: MyAdapterOnClickHandler
    
    interface MyAdapterOnClickHandler {
        fun onClick(view: View, position: Int)
    }
    
    fun setOnClickHandler(myAdapterOnClickHandler: MyAdapterOnCLickHandler){
        mClickHandler = myAdapterOnClickHandler
    }
    

    在您的视图中:

    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")
    }
    

    【讨论】:

      【解决方案2】:

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

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

      您刚刚从接口 View.OnClickListener 实现了所需的方法,但您没有在任何地方使用它(它只是您的代码 sn-p 中未使用的方法)。 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
      

      【讨论】:

        猜你喜欢
        • 2016-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-24
        • 2021-04-07
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        相关资源
        最近更新 更多