当前位置: 首页 > 知识库问答 >
问题:

如何在kotlin中单击RecycerView项内的按钮

鲜于宜修
2023-03-14

我在回收器视图项中放置了一个按钮,但我无法在单击该按钮时执行任何操作,我知道如何单击回收器视图项,但我不知道如何单击回收器视图中项的特定元素

        lateinit var front_anim: AnimatorSet
        lateinit var back_anim: AnimatorSet


        val scale = this.resources.displayMetrics.density
        packetRecView.cameraDistance = 8000 * scale
        packetRecView.cameraDistance = 8000 * scale





        front_anim =
            AnimatorInflater.loadAnimator(context, R.animator.front_animator) as AnimatorSet
        back_anim = AnimatorInflater.loadAnimator(context, R.animator.back_animator) as AnimatorSet

        if (isFront) {
            front_anim.setTarget(flip.cardOnFront)
            back_anim.setTarget(flip.backCard)
            front_anim.start()
            back_anim.start()
            isFront = false

        } else {
            front_anim.setTarget(flip.backCard)
            back_anim.setTarget(flip.cardOnFront)
            back_anim.start()
            front_anim.start()
            isFront = true


        }




        Toast.makeText(context, item.drugs, Toast.LENGTH_SHORT).show()
    }

这是我的适配器

class PacketAdapter (val packetList: ArrayList<PacketModel> , var clickListener2: onPacketItemClickListener): RecyclerView.Adapter<PacketAdapter.ViewHolder>(){


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {

        val a = LayoutInflater.from(parent?.context).inflate(R.layout.packet, parent, false)




        return ViewHolder(a)


    }

    override fun getItemCount(): Int {


        return packetList.size

    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {

        val packet : PacketModel = packetList[position]

        holder.intialize(packet, clickListener2)


    }


    class ViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView)
    {

     //   val takenButton = itemView.findViewById<Button>(R.id.taken)

        val fCard = itemView.findViewById<CardView>(R.id.cardOnFront)
        val packetTime = itemView.findViewById<TextView>(R.id.timeofPacket)
        val timeMessage = itemView.findViewById<TextView>(R.id.messageofTime)
        val bCars = itemView.findViewById<CardView>(R.id.backCard)
        val drugs = itemView.findViewById<TextView>(R.id.drugs)
        val note = itemView.findViewById<TextView>(R.id.note)
        val dosage = itemView.findViewById<TextView>(R.id.dosage)






        fun intialize(item: PacketModel, action: onPacketItemClickListener){




//            val formatter = SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ", Locale.getDefault())
//            formatter.timeZone = TimeZone.getTimeZone("UTC")
//            val result = formatter.parse(dateAsString)
//
//
//



//            takenButton.setOnClickListener(this)


            var date = (((item.date) as Timestamp).seconds) * 1000L
            fun convertLongToTime(time: Long): String {
                val date = Date(time)
                val format = SimpleDateFormat("yyyy.MM.dd HH:mm")
                format.timeZone = TimeZone.getTimeZone("GMT+5")

                return format.format(date)
            }
            var convertedDate = convertLongToTime(date)
            packetTime.text = convertedDate
            timeMessage.text = ""
            drugs.text = item.drugs
            note.text  = item.notes
            dosage.text = item.dosage

            itemView.setOnClickListener {
                action.onCardClick(item, adapterPosition)
            }



        }
    }




    interface onPacketItemClickListener{
        fun onCardClick (item: PacketModel, position: Int)
    }


}

现在我想在RecycerView项内执行单击操作。请帮忙

共有1个答案

钱欣然
2023-03-14

在您的代码中,假设您所需的按钮是mybutton,并将其定义为适配器,如下所示:

    val myButton = itemView.findViewById<Button>(R.id.myButton) // This is your Button, you declared in your xml file.
    val fCard = itemView.findViewById<CardView>(R.id.cardOnFront)
    val packetTime = itemView.findViewById<TextView>(R.id.timeofPacket)
    val timeMessage = itemView.findViewById<TextView>(R.id.messageofTime)
    val bCars = itemView.findViewById<CardView>(R.id.backCard)
    val drugs = itemView.findViewById<TextView>(R.id.drugs)
    val note = itemView.findViewById<TextView>(R.id.note)
    val dosage = itemView.findViewById<TextView>(R.id.dosage)

然后只需在适配器的initialize函数中调用MyButton.setonClickListener,如下所示:

    fun intialize(item: PacketModel, action: onPacketItemClickListener) {
        var date = (((item.date) as Timestamp).seconds) * 1000L
        fun convertLongToTime(time: Long): String {
            val date = Date(time)
            val format = SimpleDateFormat("yyyy.MM.dd HH:mm")
            format.timeZone = TimeZone.getTimeZone("GMT+5")

            return format.format(date)
        }
        var convertedDate = convertLongToTime(date)
        packetTime.text = convertedDate
        timeMessage.text = ""
        drugs.text = item.drugs
        note.text  = item.notes
        dosage.text = item.dosage

        itemView.setOnClickListener {
            action.onCardClick(item, adapterPosition)
        }

        myButton.setOnClickListener {
            // Do whatever you want on your button click as like you did to your recycler-view item click 
            //action.onCardClick(item, adapterPosition)
        }
    }
 类似资料:
  • 正如标题所说,当我单击按钮或RecycerView项目时,我想改变RecycerView项目的样式(不是在所有项目上,只是在单击的项目上)。应该看起来像 单击任一按钮后,隐藏透明覆盖并对该项目执行操作

  • 我试图在单击某个按钮时显示该按钮的值。如果我在eventListener中为此编写代码,则会弹出警报,但不会显示文本。 我已尝试将警报移动到eventListener上方和for循环内部,这将在页面加载时显示正确的值。 按钮的HTML格式: Javascript:

  • 编辑:底部的解决方案 这是一个跳棋游戏。单击一个按钮后,它等待单击第二个按钮与之交换。然而,有时你可能不想移动那个按钮,但一旦你点击了它,就没有回头路了,因为我无法禁用它。 在这里的其他帖子中,我看到人们使用 这只是使它在第一次单击后不可见。 这什么都干不了。 这也没什么用。编辑:所有这些方法都用true和false进行了尝试。 私有无效交换(){ 但你也需要 这样它就重新启用了它,或者其他什么,

  • 在我的应用程序中,我有一个活动,其中包含一个FrameLayout。在这个FrameLayout中,有一个片段,包含一个ToolBar和一个RecyclView。 在这个工具栏中,我有一个搜索按钮,它应该在项目单击时启动活动。但是,当我尝试使用onOptionsItemSelected时,应用程序会成功构建和安装,但当我尝试点击该按钮时,什么也没发生。Logcat也没有说什么。 能告诉我我做错了什

  • 我还看到了如下代码块: 但我不确定如何操纵来获得计数