在回收站视图中设置按钮时出错? 简单代码,不使用接口

如何解决在回收站视图中设置按钮时出错? 简单代码,不使用接口

在回收站视图中按下按钮时出现错误。我的应用程序没有崩溃。我正在尝试在回收站视图中设置一个按钮并在 setOnClickListener 内调用 onBindViewHolder。在 holder.Button.setOnClickListener{} 中,我将按钮文本更改为 notified。但是当我按下一个按钮时,另一个列表中其他按钮文本的值也会发生变化。这是 firestore 文档的列表视图。我有很多文件上传到回收站视图中。如果我收到错误,我应该如何在没有此错误的情况下实现 onclicklistener 按钮。[![https://i.stack.imgur.com/S0Oxm.jpg][1]][1] [![在此处输入图片描述] ][2]][2]


/**This my activity for recycler view*/

package com.example.bloodbankcompany.recyclerview

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Adapter
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.bloodbankcompany.MyAdapter
import com.example.bloodbankcompany.R
import com.example.bloodbankcompany.User1
import com.example.bloodbankcompany.User2
import com.google.firebase.firestore.*
import java.lang.NullPointerException

class MainActivity2 : AppCompatActivity() {

    private lateinit var recyclerView: RecyclerView
    private lateinit var userArrayList: ArrayList<User2>
    private lateinit var myAdapter: MyAdapter2
    private val mFireStore = FirebaseFirestore.getInstance()

    var db = FirebaseFirestore.getInstance()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main2)

        recyclerView= findViewById(R.id.recyclerview)
        recyclerView.layoutManager = LinearLayoutManager(this)

        recyclerView.setHasFixedSize(true)
        userArrayList= arrayListOf()
        myAdapter =MyAdapter2(userArrayList)


        recyclerView.adapter = myAdapter

        EventChangeListener()



    }



    private fun EventChangeListener() {
         try {
             mFireStore.collection("applicationForm").addSnapshotListener(object :
                 EventListener<QuerySnapshot> {
                 override fun onEvent(value: QuerySnapshot?,error: FirebaseFirestoreException?) {
                     if (error != null) {
                         Log.e("firestore error",error.message.toString())
                     }
                 try {
                     for (dc: DocumentChange in value?.documentChanges!!) {
                         if (dc.type == DocumentChange.Type.ADDED) {
                             userArrayList.add(dc.document.toObject(User2::class.java))
                         }
//                    Toast.makeText(applicationContext,userArrayList.toString(),Toast.LENGTH_SHORT).show()

                     }
                 } catch (e:NullPointerException){

                 }
                     myAdapter.notifyDataSetChanged()
                 }

             })
         } catch (e:NullPointerException){

         }


    }


}



/**
* This is my myAdapter  activity for adapater*/


 package com.example.bloodbankcompany.recyclerview


import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
import com.example.bloodbankcompany.R
import com.example.bloodbankcompany.RegisterActivity
import com.example.bloodbankcompany.User2
import com.google.firebase.firestore.FirebaseFirestore
import kotlinx.android.synthetic.main.list_item2.view.*

class MyAdapter2(private val userList: ArrayList<User2>): RecyclerView.Adapter<MyAdapter2.MyViewHolder>(){
var id: String = ""
    private val mFireStore = FirebaseFirestore.getInstance()


    override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): MyAdapter2.MyViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.list_item2,parent,false)
        return MyViewHolder(itemView)



    }

  

    override fun onBindViewHolder(holder: MyAdapter2.MyViewHolder,position: Int) {

        val user:User2 = userList[position]
        holder.name.text= user.name
        holder.phone.text= user.phone
        holder.address.text =user.address
        holder.bloodGroup.text= user.bloodgroup
        holder.id.text = user.id

//Setting onclicklistener to my adapter and starting intent
        holder.button.setOnClickListener {
//            holder.io = "kkj"
//            holder.id.text = " "
            holder.button.setText("notified")


//            val context=holder.button.context
//            val intent = Intent( context,RegisterActivity::class.java)
//            context.startActivity(intent)
        }

    }

    override fun getItemCount(): Int {
        return userList.size

    }

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




        val name : TextView = itemView.findViewById(R.id.tvfirstname1)
        val phone :TextView= itemView.findViewById(R.id.tvphone11)
        val address : TextView= itemView.findViewById(R.id.tvaddress1)
        val bloodGroup: TextView =itemView.findViewById(R.id.tvbloodg1)
        val id: TextView = itemView.findViewById(R.id.tvid)
        var io: String? = ""
        var button: Button = itemView.findViewById(R.id.btn_notify)

        class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
            init {
                itemView.btn_notify.setOnClickListener {

                }
            }


        }




    }
} ```


  [1]: https://i.stack.imgur.com/S0Oxm.jpg
  [2]: https://i.stack.imgur.com/BqDMf.jpg

解决方法

在您的适配器中为 clickListener 创建接口并将其设置在 constructor

interface OnItemClickListener {
fun onItemClick(position: Int)
}

并在ViewHolder中设置bind你的按钮

fun bind(position: Int,listener: OnItemClickListener) {
button.setOnClickListener { v -> listener.onItemClick(position) }
}

然后在 onBindViewHolder

中设置此代码
holder.bind( position,onItemClickListener)

最后当点击按钮时,您可以在 Activity or Fragment

中操作

示例:

adapter = Adapter(getContext(),models) { position -> }
,

简单代码,不使用接口

实际上,我发现您以正确的方式执行此操作,但是您在那里使用了两个 ViewHolder 类,这是导致问题的原因。尝试使用下面的代码一次,然后再试一次。希望它有效。

class mAdapter(val context: Context,private val dataList: ArrayList<String>):
    RecyclerView.Adapter<mAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): mAdapter.ViewHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.item_card_view,parent,false)
        return mAdapter.ViewHolder(v)
    }

    override fun onBindViewHolder(holder: mAdapter.ViewHolder,position: Int) {
        holder.txtView.setText(dataList.get(position))
        
        //Your Button setOnClickLister
        holder.btnName.setOnClickListener {
            
            // action here
        
        }

    }

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

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

       
        val txtView  = itemView.findViewById(R.id.textView) as TextView
        val btnName = itemView.findViewById(R.id.btnName) as Button

    }

}

希望它能解决您的问题。如果有帮助,请点赞。提前致谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res