Не можете показать обновленную базу данных Firebase без перезапуска приложения? - PullRequest
0 голосов
/ 20 марта 2019

Я создаю простое приложение ToDo, используя Kotlin и Android Studios, и следую этому руководству: http://appsdeveloperblog.com/todo-list-app-kotlin-firebase/

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

Вот настройка:

class MainActivity : AppCompatActivity(), ItemRowListener { //ItemRowListener points to another file that tracks the ids of the items

lateinit var mDatabase: DatabaseReference        //some global variables
var toDoItemList: MutableList<ToDoItem>? = null
lateinit var adapter: ToDoItemAdapter
private var listViewItems: ListView? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    //reference for FAB
    val fab = findViewById<View>(R.id.fab) as FloatingActionButton //basic activity
    listViewItems = findViewById<View>(R.id.items_list) as ListView
    //Adding click listener for FAB
    fab.setOnClickListener {
        //Show Dialog here to add new Item
        addNewItemDialog()
    }
    mDatabase = FirebaseDatabase.getInstance().reference
    toDoItemList = mutableListOf()
    adapter = ToDoItemAdapter(this, toDoItemList!!)
    listViewItems!!.setAdapter(adapter)
    mDatabase.orderByKey().addListenerForSingleValueEvent(itemListener) //This is the line I refer to

}

Мы смотрим на последнюю строку здесь (addListenerForSingleValueEvent).Его можно изменить на addValueEventListener, и он немедленно выталкивает добавленный элемент на экран, но также выдвигает вторую копию самого себя, без каких-либо данных.Если вы собираетесь удалить элементы, это приведет к сбою приложения, пока вы не очистите базу данных и не переустановите приложение из-за ошибки нулевого указателя при удалении элементов.

Вот окно предупреждения:

private fun addNewItemDialog() {
    val alert = AlertDialog.Builder(this)
    val itemEditText = EditText(this)
    alert.setMessage("Add New Item")
    alert.setTitle("Enter To Do Item Text")
    alert.setView(itemEditText)
    alert.setPositiveButton("Submit") { dialog, positiveButton -> //positiveButton is never used
        val todoItem = ToDoItem.create()
        todoItem.itemText = itemEditText.text.toString()
        todoItem.done = false
        //We first make a push so that a new item is made with a unique ID
        val newItem = mDatabase.child(Constants.FIREBASE_ITEM).push()
        todoItem.objectId = newItem.key
        //then, we used the reference to set the value on that ID
        newItem.setValue(todoItem)
        dialog.dismiss()
        Toast.makeText(this, "Item saved with ID " + todoItem.objectId, Toast.LENGTH_SHORT).show()
    }
    alert.show() //This is basically a popup which asks you what you want to add to the list
}

и функция, которая добавляет элемент в базу данных:

private var itemListener: ValueEventListener = object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        // Get Post object and use the values to update the UI
        addDataToList(dataSnapshot)
    }
}
private fun addDataToList(dataSnapshot: DataSnapshot) {
    val items = dataSnapshot.children.iterator()
    //Check if current database contains any collection
    if (items.hasNext()) {
        val toDoListindex = items.next()
        val itemsIterator = toDoListindex.children.iterator()

        //check if the collection has any to do items or not
        while (itemsIterator.hasNext()) {
            //get current item
            val currentItem = itemsIterator.next()
            val todoItem = ToDoItem.create()
            //get current data in a map
            val map = currentItem.getValue() as HashMap<String, Any>
            //key will return Firebase ID
            todoItem.objectId = currentItem.key
            todoItem.done = map.get("done") as Boolean?
            todoItem.itemText = map.get("itemText") as String?
            toDoItemList!!.add(todoItem);
        }
    }
    //alert adapter that has changed
    adapter.notifyDataSetChanged()
}

Функция удаления также работает, но я не вижу никаких изменений, пока не закрою и не перезапущу приложение:

override fun onItemDelete(itemObjectId: String) {
    //get child reference in database via the ObjectID
    val itemReference = mDatabase.child(Constants.FIREBASE_ITEM).child(itemObjectId)
    //deletion can be done via removeValue() method
    Toast.makeText(this, "Item deleted", Toast.LENGTH_SHORT).show()
    itemReference.removeValue()

}

Любые советы или советы приветствуются, также приветствуются любые советы.

Приложение работает, как и предполагалось, но у меня есть некоторые проблемы с обновлением.

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