Я создаю проект, использующий 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
Я хочу получать отфильтрованный список из базы данных в реальном времени каждый раз, когда пользователь нажимает на другую вкладку.