简体   繁体   English

单击项目时将数据从 recyclerView 传递到新活动 Kotlin

[英]Pass data from recyclerView to new activity when an item is clicked Kotlin

I have a recyclerView which displays items in cardview with the data from firebase database.我有一个 recyclerView,它使用来自 firebase 数据库的数据在 cardview 中显示项目。 I did the coding for launching a new activity when an item is clicked.我编写了在单击某个项目时启动新活动的编码。 Now I want to pass the data of the item clicked from the recyclerView to the new activity so that I can display the data in it.现在我想将从 recyclerView 中点击的项目的数据传递给新的活动,以便我可以在其中显示数据。 I am using kotlin. I watched few videos on yt and tried few methods.我正在使用 kotlin。我在 yt 上看的视频很少,尝试的方法也很少。 As I am a beginner I need help in solving this.因为我是初学者,所以我需要帮助来解决这个问题。 Thanks in advance.提前致谢。

I have an RecyclerItemClickListener which launches the new activity when an item is clicked.我有一个 RecyclerItemClickListener,它在单击项目时启动新活动。

RecyclerView class回收站查看 class

class storekotlin : Fragment() {
private var param1: String? = null
private var param2: String? = null

var recyclerView: RecyclerView? = null

var productlist = ArrayList<Product>()
private var database: FirebaseDatabase? = null
private var reference: DatabaseReference? = null


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    arguments?.let {
        param1 = it.getString(ARG_PARAM1)
        param2 = it.getString(ARG_PARAM2)
    }
}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    var view =  inflater.inflate(R.layout.fragment_storekotlin, container, false)

    database = FirebaseDatabase.getInstance()
    reference = database?.getReference("Products")

    val FirebaseListener = object: ValueEventListener {
        override fun onDataChange(p0: DataSnapshot) {

            val child = p0.children
            child.forEach{

                var products = Product(it.child("img").value.toString(), 
it.child("name").value.toString(), it.child("price").value.toString())

                productlist.add(products)

            }


            val adapter = ProductAdapter(productlist)
            recyclerView?.adapter = adapter

        }

        override fun onCancelled(p0: DatabaseError) {

        }


    }
    reference?.addValueEventListener(FirebaseListener)

    recyclerView = view.findViewById(R.id.recyclerview)
    recyclerView?.setHasFixedSize(true)
    recyclerView?.layoutManager = GridLayoutManager(activity, 1, 
GridLayoutManager.VERTICAL, false)

    val defuserimg: ImageView = view.findViewById(R.id.defuserimg)
    val defuser: TextView = view.findViewById(R.id.defuser)
    val info:  ImageView = view.findViewById(R.id.info)
    val search: EditText = view.findViewById(R.id.search)

    defuserimg.setOnClickListener {
        val intent = Intent(activity, signin_page::class.java)
        startActivity(intent)
    }

    defuser.setOnClickListener {
        val intent = Intent(activity, signin_page::class.java)
        startActivity(intent)
    }

    info.setOnClickListener {
        val intent = Intent(activity, aboutpage::class.java)
        startActivity(intent)
    }

    recyclerView?.addOnItemTouchListener(
        RecyclerItemClickListener(
            activity, recyclerView!!, object : 
RecyclerItemClickListener.OnItemClickListener {
                override fun onItemClick(view: View, position: Int) {

                    val intent = Intent(activity, productdetails::class.java)
                    startActivity(intent)

                }

                override fun onLongItemClick(view: View, position: Int) {
                }
            })
    )

    return view

}



companion object {

    @JvmStatic
    fun newInstance(param1: String, param2: String) =
        storekotlin().apply {
            arguments = Bundle().apply {
                putString(ARG_PARAM1, param1)
                putString(ARG_PARAM2, param2)
            }
        }
}

}

RecyclerAdapter class回收器适配器 class

class ProductAdapter(private var productlist:MutableList<Product>): 
RecyclerView.Adapter<ProductAdapter.ProductViewHolder>() {

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

    val layoutView:View = 
LayoutInflater.from(parent.context).inflate(R.layout.itemcard,parent,false)
    return ProductViewHolder(layoutView)

}

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

    Picasso.get().load(productlist[position].prdimg).into(holder.prdimg)
    holder.prdname.text = productlist[position].prdname
    holder.prdprice.text = productlist[position].prdprice


}

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

inner class ProductViewHolder(view: View): RecyclerView.ViewHolder(view){

    var prdimg: ImageView = view.findViewById(R.id.prdimg)
    var prdname: TextView = view.findViewById(R.id.prdname)
    var prdprice: TextView = view.findViewById(R.id.prdprice)



}

easiest way最简单的方法

in adapter class do like在适配器 class 中喜欢

class ProductAdapter(val fragment: storekotlin,private var productlist:MutableList<Product>): 
RecyclerView.Adapter<ProductAdapter.ProductViewHolder>() {

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

    val layoutView:View = 
LayoutInflater.from(parent.context).inflate(R.layout.itemcard,parent,false)
    return ProductViewHolder(layoutView)

}

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

    Picasso.get().load(productlist[position].prdimg).into(holder.prdimg)
    holder.prdname.text = productlist[position].prdname
    holder.prdprice.text = productlist[position].prdprice
 
 holder.itemView.setOnClickListener {
            val name = productlist[position].prdname
             val price= productlist[position].prdprice
            fragment.deatailsList(name , price) // here you can send just the position it will be more efficient
        }
}

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

inner class ProductViewHolder(view: View): RecyclerView.ViewHolder(view){

    var prdimg: ImageView = view.findViewById(R.id.prdimg)
    var prdname: TextView = view.findViewById(R.id.prdname)
    var prdprice: TextView = view.findViewById(R.id.prdprice)

}

in storekotlin Fragment onCreateView method pass the list and fragment like this在 storekotlin Fragment onCreateView 方法中传递这样的列表和片段

   val adapter = ProductAdapter(this@storekotlin,productlist)
            recyclerView?.adapter = adapter

in storekotlin activity create another method在 storekotlin 活动中创建另一种方法

  fun deatailsList(name: String, price: String?) {

        // Log.d(ContentValues.TAG, "myList:${dataList.size}")

        val intent = Intent(requireContext(), DetailsActivity::class.java)

        intent.putExtra("nameKey", name)
        intent.putExtra("priceKey", price)
       
        startActivity(intent)
    }

in Details activity onCreate method在详细信息活动的 onCreate 方法中

   val intent = intent
      
        val rcvName = intent.getStringExtra("nameKey")
        val rcvPrice= intent.getStringExtra("priceKey")

  // now you can print here the selected value 
    textDayIncome_id.text = rcvName 
    textDayExpense_id.text = rcvPrice

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何将数据从 Activity 传递到 Fragment KOTLIN? - How to pass data from Activity to Fragment KOTLIN? 将数据从 recyclerview 传递到 firebase - Pass data from recyclerview to firebase 如何从 Firestore (Kotlin) 中的嵌套地图数组中为 RecyclerView 检索数据 - How to retrieve data from nested array of maps in Firestore (Kotlin) for RecyclerView 如何将recyclerview中的所有数据传递给另一个活动并在listview或recyclerview中显示它 Firebase - How can I pass all the data in the recyclerview to another activity and show it in the listview or recyclerview Firebase 添加项目时防止recyclerview刷新项目 - Prevent recyclerview from refreshing items when an item is added 从适配器 class 中删除项目时如何更新 recyclerview - how to update recyclerview when delete an item from adapter class 为什么在 firestore 中添加新数据时 recyclerview 会刷新? - Why does recyclerview refreshed when new data is added in firestore? 如何将 firebase 数据从一个活动传递到另一个活动? - How to pass firebase data from one activity to another? 为什么recyclerview数据只有在第二次点击按钮时才加载 - Why does the recyclerview data loads only when the button is clicked the second time Firebase 数据检索并将其从片段传递到新活动不起作用 - Firebase data retrieve and passing it from fragment to new activity not working
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM