首页 > 解决方案 > onClick RecyclerView.ViewHolder 不起作用

问题描述

我正在关注 Google 官方 Codelabs(此处)上出现的 Shrine 示例应用程序。

我想创建一个简单的视图(像其他片段一样的片段)以在单击时显示任何项目的详细文本。

我认为在元素上实现 onClick 的最佳方法是在StaggeredProductCardViewHolder我看到它实现的类中RecyclerView.ViewHolder(itemView)

这是我已经尝试过的,但我什至无法点击屏幕上任何地方的任何项目,所以出了什么问题?

class StaggeredProductCardViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {

    var productImage: NetworkImageView = itemView.findViewById(R.id.product_image)
    var productTitle: TextView = itemView.findViewById(R.id.product_title)
    var productPrice: TextView = itemView.findViewById(R.id.product_price)


    override fun onClick(v: View?) {
        println("wow clicked")
        v?.context?.startActivity(Intent(v.context, ProductCardDetailActivity::class.java))
    }

    class ProductCardDetailActivity : Fragment(){

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            println("onCreate")
        }
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            println("onCreateView")
            return super.onCreateView(inflater, container, savedInstanceState)
        }
    }
}

注意:我添加了一个片段ProductCardDetailActivity,我将在其中实现其他方法以在单击时显示项目片段描述。

我真的不知道从哪里开始,从哪里开始,否则我会在这方面付出更多的努力,但我会一直在努力。

标签: androidkotlinandroid-recyclerview

解决方案


您只是在实现 View.OnClickListener 接口。它对处理点击没有任何作用。您应该附上这个以供视图持有者查看

class StaggeredProductCardViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {

var productImage: NetworkImageView = itemView.findViewById(R.id.product_image)
var productTitle: TextView = itemView.findViewById(R.id.product_title)
var productPrice: TextView = itemView.findViewById(R.id.product_price)
init{
   itemView.setOnClickListener(this)
}


override fun onClick(v: View?) {
    println("wow clicked")
    v?.context?.startActivity(Intent(v.context, ProductCardDetailActivity::class.java))
}

class ProductCardDetailActivity : Fragment(){

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        println("onCreate")
    }
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        println("onCreateView")
        return super.onCreateView(inflater, container, savedInstanceState)
    }
}

}


推荐阅读