Почему запрос firebase получает данные только один раз - PullRequest
2 голосов
/ 07 мая 2020

Я создаю проект, использующий firebase, который извлекает данные с помощью разбивки на страницы. Теперь проекту нужно отфильтровать данные с помощью вкладок. Итак, у меня разные вкладки, и я хочу, чтобы при щелчке каждой вкладки recyclerview изменял данные своего списка. Я получаю данные первой вкладки, но когда я нажимаю на другую вкладку, изменений не происходит. После отладки я обнаружил, что прослушиватель запросов запускает только один раз для первой вкладки.

Вот мой код для WorkFragment.kt :

private fun setupRecyclerView() {
    println("setupRecyclerView()")
    binding.recyclerView.apply {
        val linearLayoutManager = LinearLayoutManager(context!!)
        layoutManager = linearLayoutManager
        Database.getInstance().getPosts(category()) { //fetching the data for a category
            workAdapter.postsList = it.toMutableList()
            isLoading = false
        }
        adapter = workAdapter
    }
}

private fun setupTabs() {
    binding.tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
        override fun onTabSelected(tab: TabLayout.Tab?) {
            println("onTabSelected: tab = ${tab?.text}")
            when (tab?.text) { //Selecting the different tabs for different data.
                ASPIRE() -> category = ASPIRE
                PARVARISH() -> category = PARVARISH
                MISSION_14() -> category = MISSION_14
                AWARENESS_PERIODICALS() -> category = AWARENESS_PERIODICALS
                PROJECT_WELLNESS() -> category = PROJECT_WELLNESS
                EDUSEARCH() -> category = EDUSEARCH
            }
            Database.getInstance().getPosts(category()) {
                workAdapter.postsList.removeAll { true }
                workAdapter.postsList = it.toMutableList()
                isLoading = true
            }
        }

        override fun onTabReselected(tab: TabLayout.Tab?) {}

        override fun onTabUnselected(tab: TabLayout.Tab?) {}
    })
}

Это код для Database.getInstance (). GetPosts () :

fun getPosts(category: String, callback: Database.(List<Post>) -> Unit) {
    println("getPosts: category = $category")
    if (!isMaxData) {
        val query = if (lastNode.isEmpty())
            postsReference
                .orderByKey()
                .limitToFirst(ITEM_LOAD_COUNT)
        else
            postsReference
                .orderByKey()
                .startAt(lastNode)
                .limitToFirst(ITEM_LOAD_COUNT)

        query.addListenerForSingleValueEvent(object : ValueEventListener { // REFERENCE POINT
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                println("CHANGING FOR $category")
                if (dataSnapshot.hasChildren()) {
                    val newPosts = ArrayList<Post>()
                    for (snapshot in dataSnapshot.children) {
                        newPosts.add(snapshot.getValue(Post::class.java)!!)
                    }
                    lastNode = newPosts[newPosts.size - 1].timestamp

                    if (lastNode != lastKey)
                        newPosts.removeAt(newPosts.size - 1)
                    else
                        lastNode = "end"

                    val filteredPosts = newPosts.filter { it.category == category }
                    println(filteredPosts)
                    callback(filteredPosts)
                    isLoading = false
                } else {
                    isLoading = false
                    isMaxData = true
                }
            }

            override fun onCancelled(databaseError: DatabaseError) {
                isLoading = false
            }
        })

    }

Это мой лог-код:

I/System.out: setupRecyclerView
I/System.out: getPosts: category = A.S.P.I.R.E
I/System.out: CHANGING FOR A.S.P.I.R.E
I/System.out: //the list elements
I/System.out: onTabSelected: tab = Parvarish
I/System.out: getPosts: category = Parvarish
I/System.out: onTabSelected: tab = Mission 14th Nov
I/System.out: getPosts: category = Mission 14th Nov
I/System.out: onTabSelected: tab = A.S.P.I.R.E
I/System.out: getPosts: category = A.S.P.I.R.E

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

...