过滤 ArrayList 确定 Firebase RealTime-Database 参考 Child

Filtering ArrayList Determining a Firebase RealTime-Database Reference Child

我正在尝试根据 children 在我的一个 RTDB 引用中具有的 属性 在 activity 上过滤三个 RecyclerViews。在我的 ServiceActivity 上,我有三个 RecyclerViews,我需要帮助来了解我需要做什么来执行过滤器。我是否需要为每个 category 属性 名称创建一个空的 ArrayList,然后对每个名称执行过滤功能?或者我将如何执行此操作?谢谢!

我有什么

RTDB 参考 Child

ServiceActivity.kt

lateinit var autoJobServicesAdapter: JobServicesAdapter
lateinit var homeJobServicesAdapter: JobServicesAdapter
lateinit var personalJobServicesAdapter: JobServicesAdapter
val jobServices = ArrayList<JobService>()
val jobServicesDatabaseRef = FirebaseDatabase.getInstance().reference.child(REF_JOB_SERVICES)

val autoServices = ArrayList<JobService>()
val homeServices = ArrayList<JobService>()
val personalServices = ArrayList<JobService>()

    private fun setupAutoRecyclerView() {

        autoJobServicesAdapter = JobServicesAdapter(jobServices)

        val autoRecyclerView = findViewById<RecyclerView>(R.id.autoServicesRecyclerView)
        autoRecyclerView.apply {
            layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
            adapter = autoJobServicesAdapter
            setHasFixedSize(true)
        }

        jobServicesDatabaseRef.orderByChild("jobName").addValueEventListener(object: ValueEventListener {
            @SuppressLint("NotifyDataSetChanged")
            override fun onDataChange(snapshot: DataSnapshot) {
                jobServices.clear()
                for (snap in snapshot.children) {
                    val jobService = JobService(snap.child("category").getValue(String::class.java)!! ,
                        snap.child("jobName").getValue(String::class.java)!! , snap.child("jobImageUrl").getValue(String::class.java)!! ,
                        snap.child("jobServiceImageUrl").getValue(String::class.java)!!)
                    jobServices.add(jobService)
                }
                autoJobServicesAdapter.notifyDataSetChanged()
            }

            override fun onCancelled(error: DatabaseError) {
                Log.d("ServiceActivity", "LoadPost:onCancelled", error.toException())
            }
        })

    }

    private fun setupHomeRecyclerView() {

        homeJobServicesAdapter = JobServicesAdapter(jobServices)

        val homeRecyclerView = findViewById<RecyclerView>(R.id.homeServicesRecyclerView)
        homeRecyclerView.apply {
            layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
            adapter = homeJobServicesAdapter
            setHasFixedSize(true)
        }

        jobServicesDatabaseRef.orderByChild("jobName").addValueEventListener(object: ValueEventListener {
            @SuppressLint("NotifyDataSetChanged")
            override fun onDataChange(snapshot: DataSnapshot) {
                jobServices.clear()
                for (snap in snapshot.children) {
                    val jobService = JobService(snap.child("category").getValue(String::class.java)!! ,
                        snap.child("jobName").getValue(String::class.java)!! , snap.child("jobImageUrl").getValue(String::class.java)!! ,
                        snap.child("jobServiceImageUrl").getValue(String::class.java)!!)
                    jobServices.add(jobService)
                }
                homeJobServicesAdapter.notifyDataSetChanged()
            }

            override fun onCancelled(error: DatabaseError) {
                Log.d("ServiceActivity", "LoadPost:onCancelled", error.toException())
            }
        })

    }

    private fun setupPersonalRecyclerView() {

        personalJobServicesAdapter = JobServicesAdapter(jobServices)

        val personalRecyclerView = findViewById<RecyclerView>(R.id.personalServicesRecyclerView)
        personalRecyclerView.apply {
            layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
            adapter = personalJobServicesAdapter
            setHasFixedSize(true)
        }

        jobServicesDatabaseRef.orderByChild("jobName").addValueEventListener(object: ValueEventListener {
            @SuppressLint("NotifyDataSetChanged")
            override fun onDataChange(snapshot: DataSnapshot) {
                jobServices.clear()
                for (snap in snapshot.children) {
                    val jobService = JobService(snap.child("category").getValue(String::class.java)!! ,
                        snap.child("jobName").getValue(String::class.java)!! , snap.child("jobImageUrl").getValue(String::class.java)!! ,
                        snap.child("jobServiceImageUrl").getValue(String::class.java)!!)
                    jobServices.add(jobService)
                }
                personalJobServicesAdapter.notifyDataSetChanged()
            }

            override fun onCancelled(error: DatabaseError) {
                Log.d("ServiceActivity", "LoadPost:onCancelled", error.toException())
            }
        })

}

您从 Firebase 加载了 3 次完全相同的数据。虽然客户端足够聪明,可以为您删除这些查询的重复数据,但最好只处理一次相同的数据。

一次创建三个视图、列表和适配器,然后使用这个片段分别加载数据如何?像这样:

private fun loadDataForRecyclerViews() {
    jobServicesDatabaseRef.orderByChild("jobName").addValueEventListener(object: ValueEventListener {
        @SuppressLint("NotifyDataSetChanged")
        override fun onDataChange(snapshot: DataSnapshot) {
            jobServices.clear()
            for (snap in snapshot.children) {
                //  Load the category and the job
                val category = category
                val jobService = (category ,
                    snap.child("jobName").getValue(String::class.java)!! , snap.child("jobImageUrl").getValue(String::class.java)!! ,
                    snap.child("jobServiceImageUrl").getValue(String::class.java)!!)

                //  Put the job in the correct list based on its category
                if (category == "auto") {
                    autoJobServices.add(jobService)
                }
                else if (category == "home") {
                    homeJobServices.add(jobService)
                }
                else if (category == "personal") {
                    personalJobServices.add(jobService)
                }
            }
            //  Refresh all views
            autoJobServicesAdapter.notifyDataSetChanged()
            homeJobServicesAdapter.notifyDataSetChanged()
            personalJobServicesAdapter.notifyDataSetChanged()
        }

        override fun onCancelled(error: DatabaseError) {
            Log.d("ServiceActivity", "LoadJobs", error.toException())
        }
    })
}

注意:我没有编译这段代码,只是提供它作为起点。如果您遇到编译错误,请尝试自行修复,然后再发表评论。