如何将变量发送到适配器以通过 Intent 将其发送到另一个 activity?

How to send a variable to an Adapter to send it through an Intent to another activity?

我有一个适用于我的 RecyclerView 的适配器,我在其中编程,当我单击(我的 RecyclerView 的)元素时,它会执行一个带有 putExtra 的 Intent 将我带到另一个 activity,该变量包含我的putExtra 来自我单击的元素,但现在我需要添加一个来自 activity 的 More 变量。问题是我不知道如何从适配器发送它。

这是我的适配器。

package com.example.atipicoapp

import android.app.Activity
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.LinearLayout
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.view.menu.ActionMenuItemView
import androidx.core.content.ContextCompat.startActivity
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.list_item.view.*

class MyAdapter(private val platoList : ArrayList<Plato>
) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {






    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyAdapter.MyViewHolder {

        val itemView =
            LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)

        itemView.platoTouch.setOnClickListener(View.OnClickListener { v: View ->


        })

        return MyViewHolder(itemView)

    }

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

        val plato: Plato = platoList[position]
        holder.platoName.text = plato.platoName
        holder.platoDescription.text = plato.platoDescription
        holder.platoPrecio.text = plato.platoPrecio.toString()
        holder.platoCantidad.text = plato.platoCantidad.toString()

        when(holder){

            is MyViewHolder -> {

                holder.bind(platoList[position])

            }

        }

    }

    override fun getItemCount(): Int {

        return platoList.size

    }

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


        val platoName: TextView = itemView.findViewById(R.id.platoNombre)
        val platoDescription: TextView = itemView.findViewById(R.id.platoDescripcion)
        val platoPrecio: TextView = itemView.findViewById(R.id.platoPrecio)

        val platoTouch: LinearLayout = itemView.findViewById(R.id.platoTouch)

        val platoCantidad: TextView = itemView.findViewById(R.id.platoCant)



        private val mActivity = itemView.context as Activity
        private val intent = Intent(mActivity,SlotActivity::class.java)


        fun bind(plato: Plato){

            platoTouch.setOnClickListener{


                intent.putExtra("id", platoName.text.toString())
                mActivity.startActivity(intent)
            }

        }


    }
}

这是我的 Activity,其中包含我的 RecyclerView 和我要发送的变量。

package com.example.atipicoapp

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.firebase.firestore.*
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_menu_atipico.*

class MenuAtipicoActivity : AppCompatActivity() {

    private lateinit var recyclerView: RecyclerView
    private lateinit var platoArrayList: ArrayList<Plato>
    private lateinit var myAdapter: MyAdapter
    private lateinit var db: FirebaseFirestore

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

        recyclerView = findViewById(R.id.recyclerView)
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.setHasFixedSize(true)

        platoArrayList = arrayListOf()

        myAdapter = MyAdapter(platoArrayList)

        recyclerView.adapter = myAdapter

        pedidoId = intent.extras?.getString("pedidoId") //This is the variable I need to send

        EventChangeListener()

        Setup()

    }

    private fun EventChangeListener() {


        db = FirebaseFirestore.getInstance()
        db.collection("Platos").addSnapshotListener(object : EventListener<QuerySnapshot> {
            override fun onEvent(
                value: QuerySnapshot?,
                error: FirebaseFirestoreException?
            ) {

                if (error != null) {

                    Log.e("Firestore Error", error.message.toString())
                    return

                }

                for (dc: DocumentChange in value?.documentChanges!!) {

                    if (dc.type == DocumentChange.Type.ADDED) {

                        platoArrayList.add(dc.document.toObject(Plato::class.java))

                    }

                }

                myAdapter.notifyDataSetChanged()

            }


        })


    }

    private fun Setup() {

        botonAceptar.setOnClickListener {

            val SlotIntent = Intent(this, SlotActivity::class.java).apply {


            }
            startActivity(SlotIntent)
        }

    }

}

如果从 Adapter 执行 Intent,如何发送变量?

或者...如果不建议从我的适配器发送意图,我如何从 activity 发送它们? 知道我必须携带一个变量,它在 RecyclerView 的项目中。

感谢您的帮助<3

首先,创建一个 MyAdapter 构造函数,在其中传递 arrayList 以及 pedoidId,您的 MyAdapter 应该如下所示:

MyAdapter.class

class MyAdapter(private val platoList : ArrayList<Plato>, val pedidoId:String
) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
 ........
 .....
 ....
 
 //in your bind(..) method
   fun bind(plato: Plato){
     platoTouch.setOnClickListener{
       intent.putExtra("id", platoName.text.toString())
       intent.putExtra("pedidoId", pedidoId)
       mActivity.startActivity(intent)
     }
   }
}

并且,在您的 MenuAtipicoActivity 中,您需要执行以下操作:

MenuAtipicoActivity

class MenuAtipicoActivity : AppCompatActivity() {
 ...............
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_menu_atipico)

    recyclerView = findViewById(R.id.recyclerView)
    recyclerView.layoutManager = LinearLayoutManager(this)
    recyclerView.setHasFixedSize(true)

    platoArrayList = arrayListOf()
    pedidoId = intent.extras?.getString("pedidoId") //This is the variable I need to send
    myAdapter = MyAdapter(platoArrayList,pedidoId)
    recyclerView.adapter = myAdapter
    EventChangeListener()

    Setup()

  }
  ..........
  ........
 
}