过滤 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())
}
})
}
注意:我没有编译这段代码,只是提供它作为起点。如果您遇到编译错误,请尝试自行修复,然后再发表评论。
我正在尝试根据 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())
}
})
}
注意:我没有编译这段代码,只是提供它作为起点。如果您遇到编译错误,请尝试自行修复,然后再发表评论。