Ошибка дублирования при вводе данных в Firebase Android Studio - PullRequest
0 голосов
/ 23 января 2019

У меня возникла проблема, когда я добавляю данные в Firebase, вместо того, чтобы добавлять новые данные в базу данных, он берет уже имеющиеся данные, повторяет их и затем добавляет новые данные.

Например, если у меня есть названия "Red Dead" и "GTA", и я хочу добавить "COD". Вместо базы данных, выглядящей как «Red Dead», «GTA» и «COD», она выглядит как «Red Dead», «GTA», «Red Dead», «GTA», а затем «COD».

Любые идеи о том, как это исправить, пожалуйста

package com.example.gearoidodonovan.books

import android.app.AlertDialog
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.renderscript.Sampler
import android.widget.Toast
import com.google.firebase.database.*
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.add_note.view.*
import java.text.SimpleDateFormat
import java.util.*


class MainActivity : AppCompatActivity() {

var mRef:DatabaseReference? = null
var mNoteList:ArrayList<Note>?= null





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


    val database = FirebaseDatabase.getInstance()
    mRef = database.getReference("Notes")
    mNoteList = ArrayList()



    add_new_note.setOnClickListener {

        showDialogAddNote()


    }
}

override fun onStart(){
    super.onStart()
    mRef?.addValueEventListener(object : ValueEventListener{
        override fun onCancelled(pO: DatabaseError) {
        }

        override fun onDataChange(p0: DataSnapshot) {
            for (n in p0!!.children) {
                var note = n.getValue(Note::class.java)
                mNoteList?.add(note!!)

            }

            val noteAdapter = NoteAdapter(applicationContext, mNoteList!!)
            note_list_view.adapter = noteAdapter

        }

    })

}


fun showDialogAddNote() {
    val alertBuilder = AlertDialog.Builder(this)

    val view = layoutInflater.inflate(R.layout.add_note, null)

    alertBuilder.setView(view)

    val alertDialog = alertBuilder.create()
    alertDialog.show()


    view.btnSaveNote.setOnClickListener {
        val title = view.etTitle.text.toString()
        val note = view.etNote.text.toString()

        if (title.isNotEmpty() && note.isNotEmpty()) {
            var id = mRef!!.push().key!! //reference 1

            var myNote = Note(id, title, note, getCurrentDate())
            mRef!!.child(id).setValue(myNote)
            alertDialog.dismiss()


        } else {
            Toast.makeText(this, "Empty", Toast.LENGTH_LONG).show()
        }


    }

}

    fun getCurrentDate(): String{
        val calendar = Calendar.getInstance()
        val mdformat = SimpleDateFormat("EEEE hh:mm a ")
        val strDate = mdformat.format(calendar.time)
        return strDate


}
}

Вот мой класс заметок

package com.example.gearoidodonovan.books


import com.google.firebase.database.Exclude
import com.google.firebase.database.ServerValue



class Note {
var id:String?= null
var title:String? = null
var note:String?= null
var timestamp: String? = null

constructor(){

}

constructor(id: String, title: String, note: String, timestamp: String){
    this.id = id
    this.title = title
    this.note = note
    this.timestamp = timestamp
}







}

А вот и мой класс адаптера

package com.example.gearoidodonovan.books

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import kotlinx.android.synthetic.main.note_layout.view.*
import kotlin.collections.ArrayList

class NoteAdapter(context: Context, noteList: ArrayList<Note>)
: ArrayAdapter<Note>(context, 0, noteList) {


override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
   val view = LayoutInflater.from(context).inflate(R.layout.note_layout,parent ,false)

    val note:Note = getItem(position)
    view.titleText.text = note.title
    view.timeText.text = note.timestamp.toString()
    return view


}



}

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Если это происходит, когда вы хотите получить список данных из Firebase, инициализируйте ваш ArrayList перед добавлением новых данных. Потому что метод onDataChange берет все данные из Firebase и отображает их в ListView.
Таким образом, вы должны инициализировать между onDataChange и for

0 голосов
/ 23 января 2019

Используйте childEventListener вместо valueEventListener.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...