单击项目时将数据从 recyclerView 传递到新 activity Kotlin
Pass data from recyclerView to new activity when an item is clicked Kotlin
我有一个 recyclerView,它使用来自 firebase 数据库的数据在 cardview 中显示项目。我编写了在单击某个项目时启动新 activity 的编码。现在我想把从recyclerView点击的item的数据传递给new activity 这样我就可以在里面显示数据了。我正在使用科特林。我在 yt 上看了几个视频,尝试了一些方法。因为我是初学者,所以我需要帮助来解决这个问题。提前致谢。
我有一个 RecyclerItemClickListener,它会在单击项目时启动新的 activity。
RecyclerView 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 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)
}
最简单的方法
在适配器中 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)
}
在 storekotlin Fragment onCreateView 方法中像这样传递列表和片段
val adapter = ProductAdapter(this@storekotlin,productlist)
recyclerView?.adapter = adapter
在 storekotlin 中 activity 创建另一个方法
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)
}
详解activityonCreate方法
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
我有一个 recyclerView,它使用来自 firebase 数据库的数据在 cardview 中显示项目。我编写了在单击某个项目时启动新 activity 的编码。现在我想把从recyclerView点击的item的数据传递给new activity 这样我就可以在里面显示数据了。我正在使用科特林。我在 yt 上看了几个视频,尝试了一些方法。因为我是初学者,所以我需要帮助来解决这个问题。提前致谢。
我有一个 RecyclerItemClickListener,它会在单击项目时启动新的 activity。
RecyclerView 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 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)
}
最简单的方法
在适配器中 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)
}
在 storekotlin Fragment onCreateView 方法中像这样传递列表和片段
val adapter = ProductAdapter(this@storekotlin,productlist)
recyclerView?.adapter = adapter
在 storekotlin 中 activity 创建另一个方法
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)
}
详解activityonCreate方法
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