Kotlin Recycler 查看 ItemClick to new Intent

Kotlin Recyclerview ItemClick to new Intent

我有问题。当我点击 Recyclerview 中的任何项目时,我可以打印一条消息。但我想在单击时切换到不同的 activity。你能以一种非常具体的方式帮助我吗?这对我来说是一个非常重要的项目。我写的代码块如下。提前致谢。

客户适配器

class 客户适配器(私有值 companynameArray:ArrayList,私有值 companyoffArray:ArrayList,私有值 companyPhoneArray:ArrayList): RecyclerView.Adapter() {

class CustomerHolder(view: View) : RecyclerView.ViewHolder(view) {

    var recycleCompanyName: TextView?=null
    var recycleOffName: TextView?=null
    var recycleOffPhone: TextView?=null


    init {
        recycleCompanyName=view.findViewById(R.id.recycleCompanyName)
        recycleOffName=view.findViewById(R.id.recycleOffName)
        recycleOffPhone=view.findViewById(R.id.recycleOffPhone)

        itemView.setOnClickListener {


        }


    }



}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomerHolder {
    val inflater= LayoutInflater.from(parent.context)
    val view= inflater.inflate(R.layout.recycler_view_customer_row,parent,false)
    return CustomersAdapter.CustomerHolder(view)
}

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

override fun onBindViewHolder(holder: CustomerHolder, position: Int) {
    holder.recycleCompanyName?.text="Şirket Adı:"+companynameArray[position]
    holder.recycleOffName?.text="Şirket Yetkilisi :"+companyoffArray[position]
    holder.recycleOffPhone?.text="İrtibat No : "+companyPhoneArray[position]
    }
}

我没有指定activity我想去的。如果您能提供帮助,我将不胜感激。

如果有帮助,我把客户端的代码写在这里class

class 客户:AppCompatActivity()

{

private lateinit var auth: FirebaseAuth
private lateinit var db: FirebaseFirestore

var companynameFB:ArrayList<String> = ArrayList()
var companyoffFB:ArrayList<String> = ArrayList()
var companyphoneFB:ArrayList<String> = ArrayList()
var adapter :CustomersAdapter?=null


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_customers)

    auth= FirebaseAuth.getInstance()
    db= FirebaseFirestore.getInstance()
     getDataFromFirestore()

    var layoutManager= LinearLayoutManager(this)
    recyclerView.layoutManager=layoutManager

    adapter= CustomersAdapter(companynameFB,companyoffFB,companyphoneFB)
    recyclerView.adapter=adapter

}

fun getDataFromFirestore(){

    db.collection("Customers")
        .addSnapshotListener { snapshot, exception ->

        if(exception!=null){

            Toast.makeText(applicationContext,exception.localizedMessage.toString(),Toast.LENGTH_LONG).show()

        }else{

            if(snapshot!=null){

                if (!snapshot.isEmpty){

                    companynameFB.clear()
                    companyoffFB.clear()
                    companyphoneFB.clear()


                    val documents=snapshot.documents
                    for (document in documents){


                        val compname=document.get("compname") as String
                        val compoff=document.get("compoff") as String
                        val compphone=document.get("compphone") as String
                        val user=document.get("user") as String
                        val timeStamp=document.get("date") as Timestamp
                        val date=timeStamp.toDate()

                        companynameFB.add(compname)
                        companyoffFB.add(compoff)
                        companyphoneFB.add(compphone)

                        adapter!!.notifyDataSetChanged()



                    }
                }
            }

        }


    }



}


override fun onCreateOptionsMenu(menu: Menu?): Boolean {

val menuInflater=getMenuInflater() menuInflater.inflate(R.menu.add_customer,菜单)

    return super.onCreateOptionsMenu(menu)
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {

    if(item.itemId==R.id.add){


        val intent= Intent(this,AddCustomers::class.java)

intent.putExtra("信息","新") 开始活动(意图)

    }


    return super.onOptionsItemSelected(item)
}

将您的点击侦听器放在 onBindViewHolder 方法中

override fun onBindViewHolder(holder: CustomerHolder, position: Int) {
    holder.recycleCompanyName?.text="Şirket Adı:"+companynameArray[position]
    holder.recycleOffName?.text="Şirket Yetkilisi :"+companyoffArray[position]
    holder.recycleOffPhone?.text="İrtibat No : "+companyPhoneArray[position]

 holder.itemView.setOnClickListener {
            // do what ever you want here
            holder.itemView.context.startActivity( /*your intent here*/)
        }
    }
}

第 1 步:在此处传递上下文

class CustomersAdapter(val context:Context,private val 
companynameArray:ArrayList,private val 
companyoffArray:ArrayList, private val companyPhoneArray:ArrayList): 
RecyclerView.Adapter<CustomersAdapter.CustomerHolder>() {

第 2 步:

  itemView.setOnClickListener {
       val intent=Intent(context,yourActivity::java.class)
       startActivity(intent)
    }

你需要一个 context 的意图,这样你就可以从 activity 片段中得到它 与此 适配器 相关联并将其传递给您的意图,或者您可以像这样从展开的布局中的任何视图中获取它

 val context=holder.title.context
    val intent = Intent( context, EventDetail::class.java)
    context.startActivity(intent)

要开始一个新的 Activity,您至少需要一个上下文实例。正如此处的其他一些答案所写,您可以使用视图的上下文直接在 ViewHolder 内启动 activity。但为了更好地分离责任,我建议您将导航移至您的 Fragment/Activity,所有其他导航都发生在该位置。这样你就知道 Activity/Fragment 的外观,可以从该屏幕完成哪些导航,并且你不需要搜索 AdapterViewHolder 中发生的一些隐藏导航。此外,如果您需要执行 startActivityForResult,那么 Context 的实例不足以执行此操作。为此,您需要一个 ActivityFragment 实例,我们还有另一个理由将所有导航放在那里。

所以你可以这样做:

将 LAMBDA 添加到适配器构造函数:

class CustomersAdapter(private val companynameArray: ArrayList,
private val companyoffArray: ArrayList, 
private val companyPhoneArray: ArrayList, 
private val onItemClick: () -> Unit) : RecyclerView.Adapter<CustomersAdapter.CustomerHolder>() {

注意:将 lambda 作为最后一个构造函数参数。

将 LAMBDA 添加到 VIEWHOLDER 构造函数:

class CustomerHolder(view: View, 
    private val onItemClick: () -> Unit) : RecyclerView.ViewHolder(view) {

修改 VIEWHOLDER 构造函数调用:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomerHolder {
    val inflater = LayoutInflater.from(parent.context)
    val view = inflater.inflate(R.layout.recycler_view_customer_row,parent,false)
    return CustomersAdapter.CustomerHolder(view, onItemClick) //Add onItemClick lambda instance from adapter here
}

单击时调用 LAMBDA:

itemView.setOnClickListener {
    onItemClick()
}

修复适配器构造函数调用:

val adapter = CustomersAdapter(companynameArray, companyoffArray, companyPhoneArray) {
    startActivity() // do your navigation here
}

为什么我们将 lambda 作为适配器中构造函数的最后一个参数?如果函数的最后一个参数是一个函数,那么作为相应参数传递的 lambda 表达式可以放在括号外(SOURCE)。我们在上面处理导航的最后一段代码中正是这样做的。