Можем ли мы получить данные Firebase в счетчике? - PullRequest
0 голосов
/ 13 июля 2020

Я добавил базу данных firebase, и данные также сохраняются в базе данных firebase realtime, но они не отображаются в счетчике, мой счетчик не показывает значения. Если есть другой способ?

Это код моего фрагмента:

class IncomeFragment: Fragment(){

//FAB
lateinit var addBankFab: FloatingActionButton
lateinit var addBankText: TextView

//Spinner
lateinit var spinner: Spinner
lateinit var dropDown: TextView

//Firebase Database
lateinit var mAuth: FirebaseAuth
lateinit var mIncomeDatabase: DatabaseReference
lateinit var mBankDatabase: DatabaseReference
lateinit var helper: FirebaseHelper

//Recycler View
lateinit var recyclerView: RecyclerView

//TextView
lateinit var incomeTotal : TextView

//Update Edit Text
lateinit var editAmount: EditText
lateinit var editType: EditText
lateinit var editNote: EditText
lateinit var editBankName:EditText

//Button for update and delete
lateinit var btnUpdate: Button
lateinit var btnDelete: Button
lateinit var btnSave : Button
lateinit var btnCancel:Button

//Data item Value

lateinit var type: String
lateinit var note: String
var amount: Int = 0
lateinit var post_key:String
lateinit var name:String
lateinit var ac:String

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    val myview= inflater.inflate(R.layout.fragment_income, container, false)
    mAuth= FirebaseAuth.getInstance()
    val mUser = mAuth.currentUser
    val uid = mUser?.uid

    addBankFab=myview.findViewById(R.id.add_bank_fab)
    addBankText=myview.findViewById(R.id.add_bank_text)


    spinner=myview.findViewById(R.id.incomeSpinner)

    mIncomeDatabase =
        FirebaseDatabase.getInstance().reference.child("IncomeData").child(uid.toString())
    incomeTotal=myview.findViewById(R.id.income_txt_result)

    mBankDatabase= FirebaseDatabase.getInstance().reference.child("BankData").child(uid.toString())


    helper = FirebaseHelper(mBankDatabase)

    spinner.setAdapter(
        activity?.let {
            ArrayAdapter<String>(
                it,
                android.R.layout.simple_list_item_1,
                helper.retrieve()
            )
        }
    )

    recyclerView=myview.findViewById(R.id.incomeRecyclerView)
    val layoutManager = LinearLayoutManager(activity)
    layoutManager.reverseLayout = true
    layoutManager.stackFromEnd = true
    recyclerView.setHasFixedSize(true)
    recyclerView.layoutManager = layoutManager

    mIncomeDatabase.addValueEventListener(object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            var totalvalue :Int = 0
            for (ds in dataSnapshot.children) {
                val data: Data = ds.getValue<Data>(Data::class.java)!!
                totalvalue+=data.amount
                val stTotalValue:String = valueOf(totalvalue)

                incomeTotal.text = stTotalValue+".00"

            }

        }

        override fun onCancelled(databaseError: DatabaseError) {}
    })


    return myview

}




private fun insertBank() {
    val bankdialog = AlertDialog.Builder(activity)
    val inflater = LayoutInflater.from(activity)
    val view: View = inflater.inflate(R.layout.add_bank_layout, null)
    bankdialog.setView(view)
    val dialog = bankdialog.create()
    dialog.setCancelable(false)

    val BankName = view.findViewById<EditText>(R.id.account_bank)
    val BankAc = view.findViewById<EditText>(R.id.account_number)
    val btnSaveBank = view.findViewById<Button>(R.id.btn_save_bank)
    val btnCancelBank = view.findViewById<Button>(R.id.btn_cancel_bank)

    btnSaveBank.setOnClickListener {

        val name = BankName.text.toString().trim()
        val ac = BankAc.text.toString().trim()


        if (TextUtils.isEmpty(name)) {
            BankName.error = "Required Field..."
            return@setOnClickListener
        }

        if (TextUtils.isEmpty(ac)) {
            BankAc.error = "Required Field..."
            return@setOnClickListener
        }

        val bankacno = ac.toInt()


        val id: String? = mBankDatabase.push().key
        val mDate: String = DateFormat.getDateInstance().format(Date())
        val bankdata = EmiData(bankacno, name, id, mDate)
        mBankDatabase.child(id.toString()).setValue(bankdata)
        Toast.makeText(activity, "DATA ADDED", Toast.LENGTH_SHORT).show()


        dialog.dismiss()

    }

    btnCancelBank.setOnClickListener {
        dialog.dismiss()

    }

    dialog.show()
}

override
fun onStart() {
    super.onStart()
    val options = FirebaseRecyclerOptions.Builder<Data>()
        .setQuery(mIncomeDatabase, Data::class.java)
        .setLifecycleOwner(this)
        .build()
    val firebaseRecyclerAdapter: FirebaseRecyclerAdapter<Data, MyViewHolder> =
        object : FirebaseRecyclerAdapter<Data, MyViewHolder>(options) {
            override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
                return MyViewHolder(
                    LayoutInflater.from(parent.context)
                        .inflate(R.layout.income_recycler_data, parent, false)
                )
            }

            override fun onBindViewHolder(holder: MyViewHolder, position: Int, model: Data) {

                holder.setType(model.type)
                holder.setAmount(model.amount)
                holder.setDate(model.date)
                holder.setNote(model.note)

                holder.mView.setOnClickListener {

                    post_key= getRef(position).key.toString()

                    type=model.type
                    note=model.note
                    amount=model.amount

                    updateDataItem()
                    }

            }

        }
    recyclerView.adapter = firebaseRecyclerAdapter
}

class MyViewHolder(itemView: View) : ViewHolder(itemView) {
    val mView = itemView

    fun setType(type: String) {
        val mType = mView.findViewById<TextView>(R.id.type_txt_income)
        mType.text = type
    }
    fun setNote(note: String) {
        val mNote = mView.findViewById<TextView>(R.id.note_txt_income)
        mNote.text = note
    }
    fun setDate(date: String) {
        val mDate = mView.findViewById<TextView>(R.id.date_txt_income)
        mDate.text = date
    }
    fun setAmount(amount: Int) {
        val mAmount = mView.findViewById<TextView>(R.id.amount_txt_income)
        val stAmount = valueOf(amount)
        mAmount.text = stAmount
    }



}

private fun updateDataItem() {
    val mydialog = AlertDialog.Builder(activity)
    val inflater = LayoutInflater.from(activity)
    val myView: View = inflater.inflate(R.layout.update_data_item, null)
    mydialog.setView(myView)
    val dialog = mydialog.create()

    val editAmount = myView.findViewById<EditText>(R.id.amount_edit)
    val editType = myView.findViewById<EditText>(R.id.type_edit)
    val editNote = myView.findViewById<EditText>(R.id.note_edit)

    //Set data to edit text..

    editType.setText(type)
    editType.setSelection(type.length)

    editNote.setText(note)
    editNote.setSelection(note.length)

    editAmount.setText(valueOf(amount))
    editAmount.setSelection(valueOf(amount).length)

    val btnUpdate = myView.findViewById<Button>(R.id.btn_update)
    val btnDelete = myView.findViewById<Button>(R.id.btn_delete)

    btnUpdate.setOnClickListener {
        type = editType.text.toString().trim()
        note = editNote.text.toString().trim()

        var mdAmount = amount.toString()
        mdAmount = editAmount.text.toString().trim { it <= ' ' }
        val myAmount = mdAmount.toInt()

        val mDate: String = DateFormat.getDateInstance().format(Date())
        val data = Data(myAmount, type, note, post_key, mDate)

        mIncomeDatabase.child(post_key).setValue(data)

        dialog.dismiss()


    }

    btnDelete.setOnClickListener {
        mIncomeDatabase.child(post_key).removeValue()

        dialog.dismiss()
    }
    dialog.show()
}
}

Это мой помощник по firebase:

class FirebaseHelper (val db: DatabaseReference) {private var saved: Boolean? = ноль

//SAVE
fun save(bankData: BankData?): Boolean? {
    saved = if (bankData == null) {
        false
    } else {
        try {
            db.child("name").push().setValue(bankData)
            true
        } catch (e: DatabaseException) {
            e.printStackTrace()
            false
        }
    }
    return saved
}

//READ
fun retrieve(): ArrayList<String> {
    val bankNames = ArrayList<String>()
    db.addChildEventListener(object : ChildEventListener {
        override fun onChildAdded(
            dataSnapshot: DataSnapshot,
            s: String?
        ) {
            fetchData(dataSnapshot, bankNames)
        }

        override fun onChildChanged(
            dataSnapshot: DataSnapshot,
            s: String?
        ) {
            fetchData(dataSnapshot, bankNames)
        }

        override fun onChildRemoved(dataSnapshot: DataSnapshot) {}
        override fun onChildMoved(
            dataSnapshot: DataSnapshot,
            s: String?
        ) {
        }

        override fun onCancelled(databaseError: DatabaseError) {}
    })
    return bankNames
}

private fun fetchData(
    snapshot: DataSnapshot,
    bankData: ArrayList<String>
) {
    bankData.clear()
    val name: BankData? = snapshot.getValue(BankData::class.java)
    bankData.add(bankData.toString())
    }


}

1 Ответ

0 голосов
/ 13 июля 2020

Ваш счетчик не показывает значения, потому что данные еще не получены из БД.

Итак, что вам нужно сделать, это создать обратный вызов от FirebaseHelper до IncomeFragment

Во-первых, создать обратный вызов

interface FirebaseHelperCallback {
    fun dataRetrievedFromDB(data: List<String>)
}

Во-вторых, создать переменную, функцию установки и вызвать функцию dataRetrievedFromDB в FirebaseHelper классе

class FirebaseHelper(val db: DatabaseReference) {
   private lateinit var firebaseHelperCallback: FirebaseHelperCallback

    fun setFirebaseHelperCallback(firebaseHelperCallback: FirebaseHelperCallback) {
        this.firebaseHelperCallback = firebaseHelperCallback
    }

    ...

    private fun fetchData(snapshot: DataSnapshot, bankData: ArrayList<String>) {
       bankData.clear()
       val name: BankData? = snapshot.getValue(BankData::class.java)
       bankData.add(bankData.toString())
       firebaseHelperCallback.dataRetrievedFromDB(bankData)
    }
}

Наконец, реализовать обратный вызов в IncomeFragment

class IncomeFragment: Fragment(), FirebaseHelperCallback {


   override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
   ): View? {
      ...
      helper.setFirebaseHelperCallback(this)
   }

   ...

   override fun dataRetrievedFromDB(data: List<String>) {
        spinner.setAdapter(
           activity?.let {
             ArrayAdapter<String>(
                it,
                android.R.layout.simple_list_item_1,
                data
             )
           }
        )
   }
}
...