简体   繁体   English

通过在 recycleradapter 中实现接口,使用 kotlin 通过回收器适配器将哈希映射写入 Firebase

[英]Writing a hash map into a firebase using kotlin though recycler adapter by implementing an interface in the recycleradapter

I want to write a hashmap into my firebase using the click listener which I have implemented in the fragment which acts only if one of the items is selected.我想使用我在片段中实现的单击侦听器将哈希图写入我的 Firebase,该侦听器仅在选择其中一项时起作用。 but I get an error that I haven't got anytime before.但我收到了以前从未遇到过的错误。

The logcat shows: logcat 显示:

java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
        at java.util.ArrayList.get(ArrayList.java:437)
        at com.reazon.foodrunner.adapter.MenuRecyclerAdapter$MenuViewHolder$bind$1$1.onDataChange(MenuRecyclerAdapter.kt:104)
        at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
        at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
        at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)

this is my adapter :这是我的适配器:

package com.reazon.foodrunner.adapter

import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.RelativeLayout
import android.widget.TextView
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.*
import com.reazon.foodrunner.R
import com.reazon.foodrunner.fragment.CartFragment
import com.reazon.foodrunner.model.MenuItem


class MenuRecyclerAdapter(
    val context: Context,
    private val btnProceedToCart: Button,
    private val proceedToCartPassed: RelativeLayout,
    private val menuList: List<MenuItem>,
    private val listener: ContentListener
) : RecyclerView.Adapter<MenuRecyclerAdapter.MenuViewHolder>() {

    private var goToCart: Int = 0
    private var itemSelected: Int = 0
    private var itemNumber: Int = 0
    private var itemSelectedId = arrayListOf<String>()
    private var itemSelectedName = arrayListOf<String>()
    lateinit var proceedToCartLayout: RelativeLayout

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MenuViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.recycler_menu_single_row, parent, false)

        return MenuViewHolder(view)
    }

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

    override fun onBindViewHolder(holder: MenuViewHolder, position: Int) {
        val menuItemItem = menuList[position]
        holder.menuItemName.text = menuItemItem.item.toString()

        proceedToCartLayout = proceedToCartPassed

        btnProceedToCart.setOnClickListener {
            Toast.makeText(context, "Proceeding To Cart", Toast.LENGTH_SHORT).show()
        }

        holder.btnMenuItem.setOnClickListener {
            if (holder.btnMenuItem.text.toString() == "Remove") {
                itemSelected--
                holder.btnMenuItem.text = "ADD"
                itemSelectedId.remove(holder.btnMenuItem.toString())
                itemSelectedName.remove(holder.menuItemName.toString())
                holder.btnMenuItem.setBackgroundResource(R.drawable.btn_menu_add_background)

            } else {
                itemSelected++
                holder.btnMenuItem.text = "Remove"
                itemSelectedId.add(holder.btnMenuItem.toString())
                itemSelectedName.add(holder.menuItemName.toString())
                holder.btnMenuItem.setBackgroundResource(R.drawable.btn_menu_remove_background)

            }
            if (itemSelected > 0) {
                proceedToCartLayout.visibility = View.VISIBLE
            } else {
                proceedToCartLayout.visibility = View.INVISIBLE
            }

            print("$goToCart")
            holder.btnMenuItem.tag = menuItemItem.id

            itemNumber = position + 1

            Log.d("Restaurant", "" + holder.menuItemName.text)
        }
        holder.btnMenuItem.tag = menuItemItem.id.toString() + ""
        holder.bind(itemSelectedId, itemSelectedName, btnProceedToCart, listener)
    }

    class MenuViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        fun bind(menuSelectedId: List<String>, menuList: List<String>, btnProceedToCart: Button, listener: ContentListener) {
            btnProceedToCart.setOnClickListener {

                val mReference = FirebaseDatabase.getInstance().reference.child("Orders")
                    .child(FirebaseAuth.getInstance().currentUser!!.uid)

                mReference.addValueEventListener(object : ValueEventListener {
                        override fun onDataChange(snapshot: DataSnapshot) {
                            val orderHashMap = HashMap<String, Any>()

                            for (item in 1..menuList.size) {
                                orderHashMap["id"] = menuSelectedId[item]
                                orderHashMap["item"] = menuList[item]
                                orderHashMap["cost"] = 200
                                orderHashMap["placed"] = true
                            }

                            mReference.updateChildren(orderHashMap)
                        }

                        override fun onCancelled(error: DatabaseError) {
                            Log.d("MenuRecyclerAdapter", error.message)

                        }

                    })

                listener.openCart()
            }
        }

        val menuItemName: TextView = view.findViewById(R.id.menuItemName)
        val btnMenuItem: Button = view.findViewById(R.id.btnMenuAdd)
    }

    interface ContentListener {
        fun openCart()
    }
}

this is my menu fragment:这是我的菜单片段:

package com.reazon.foodrunner.fragment

import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.RelativeLayout
import androidx.core.os.bundleOf
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.firebase.database.*
import com.reazon.foodrunner.R
import com.reazon.foodrunner.adapter.MenuRecyclerAdapter
import com.reazon.foodrunner.model.MenuItem
import com.reazon.foodrunner.model.Restaurant
import kotlinx.android.synthetic.main.fragment_menu.*
import kotlinx.android.synthetic.main.recycler_home_single_row.*
import kotlinx.android.synthetic.main.recycler_menu_single_row.*

class MenuFragment : Fragment(),MenuRecyclerAdapter.ContentListener{

    private var menuRecyclerAdapter: MenuRecyclerAdapter? = null
    private lateinit var menuReference: DatabaseReference
    private var recyclerMenu: RecyclerView? = null
    internal var menuItemList: MutableList<MenuItem> = ArrayList()
    private var layoutManager: RecyclerView.LayoutManager? = null
    private lateinit var proceedToCartLayout:RelativeLayout
    private lateinit var btnProceedToCart: Button

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_menu, container, false)

        menuReference = FirebaseDatabase.getInstance().reference.child("Menu")
        recyclerMenu = view.findViewById(R.id.recyclerMenu)
        btnProceedToCart = view.findViewById(R.id.btnGoToCart)
        proceedToCartLayout = view.findViewById(R.id.rlProceedToCart)

//        val restaurant = (Restaurant::class.java)


        layoutManager = LinearLayoutManager(activity)
        recyclerMenu!!.layoutManager = layoutManager

        retrieveMenu()

        return view
    }

    private fun retrieveMenu() {
        menuItemList.clear()
        menuReference.addValueEventListener(object : ValueEventListener {
            override fun onCancelled(error: DatabaseError) {
                Log.d("ERROR", "" + error.message)
            }

            override fun onDataChange(snapshot: DataSnapshot) {

                for (p0 in snapshot.children) {
                    val menu = p0.getValue(MenuItem::class.java)

                    menuRecyclerAdapter = MenuRecyclerAdapter(context!!, btnProceedToCart, proceedToCartLayout,menuItemList,this@MenuFragment)//,this@MenuFragment)
                    recyclerMenu!!.adapter = menuRecyclerAdapter


                    if (menu != null) {
                        menuItemList.add(menu)
                    }

                }
            }

        })
    }

    fun onBackPressed() {
        when (this.fragmentManager?.findFragmentById(R.id.frame)) {
            !is HomeFragment -> openHome()
        }

    }
    private fun openHome() {
        val transaction = fragmentManager?.beginTransaction()
        transaction?.replace(R.id.frame, HomeFragment())
        transaction?.commit()
    }

    override fun openCart() {
        val transaction = fragmentManager?.beginTransaction()
        transaction?.replace(R.id.frame, CartFragment())
        transaction?.commit()
    }
}

although I haven't made the cart fragment and recycler properly, this is my cart fragment:虽然我没有正确制作购物车片段和回收器,但这是我的购物车片段:

package com.reazon.foodrunner.fragment

import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.DatabaseReference
import com.google.firebase.database.FirebaseDatabase
import com.reazon.foodrunner.R
import com.reazon.foodrunner.activity.FinishActivity
import com.reazon.foodrunner.adapter.CartRecyclerAdapter
import com.reazon.foodrunner.model.Order
import kotlinx.android.synthetic.main.fragment_cart.*

class CartFragment : Fragment() {

    lateinit var btnCheckout:Button
    private var recyclerCart:RecyclerView? = null
    private var recyclerAdapter:CartRecyclerAdapter? = null
    private var layoutManager:RecyclerView.LayoutManager? = null
    private var orderList:MutableList<Order> =  ArrayList()
    private var cartDatabaseReference:DatabaseReference? = null

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment

        val view = inflater.inflate(R.layout.fragment_cart, container, false)
        btnCheckout = view.findViewById(R.id.btnCheckout)

        val firebaseUid = FirebaseAuth.getInstance().currentUser!!.uid
        cartDatabaseReference = FirebaseDatabase.getInstance().reference.child("Orders").child(firebaseUid)

        layoutManager =LinearLayoutManager(activity)
        recyclerCart = view.findViewById(R.id.recyclerCart)
        recyclerCart!!.layoutManager = layoutManager

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

        return view
    }

}

Cart adapter:购物车适配器:


package com.reazon.foodrunner.adapter

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.reazon.foodrunner.R
import com.reazon.foodrunner.model.Order
import kotlinx.android.synthetic.*
import kotlinx.android.synthetic.main.recycler_cart_single_row.view.*
import java.util.function.ToDoubleBiFunction

class CartRecyclerAdapter(
    val context: Context,
    private val orderList:List<Order>
):RecyclerView.Adapter<CartRecyclerAdapter.CartViewHolder>() {
    class CartViewHolder(view: View):RecyclerView.ViewHolder(view){
        val txtItemName:TextView = view.findViewById(R.id.txtItemNameCart)

    }

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

    override fun onBindViewHolder(holder: CartViewHolder, position: Int) {
        val order = orderList[position]
        holder.txtItemName.text = order.item
    }

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

I am unable to understand what to do here to simply upload the hash map of orders and retrieve them. 我无法理解在这里做什么来简单地上传订单的哈希图并检索它们。

it was a simple error as I was using the index (indices) in the wrong manner as it should have been这是一个简单的错误,因为我以错误的方式使用索引(索引),因为它应该是

 for (item in menuList.indices) {
      orderHashMap["id"] = menuSelectedId[item]
      orderHashMap["item"] = menuList[item]
      orderHashMap["cost"] = 200
      orderHashMap["placed"] = true
}

and the list got the correct index of each element thereafter, and hashmap was written to firebase.并且此后列表获得了每个元素的正确索引,并且将 hashmap 写入了 firebase。

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM