我遇到了一个尴尬的情况,我两天来一直试图找到原因并解决它,但我失败了。
我先解释一下。
启动应用程序时recyclerView
在“HomeFragment”中填充了从以下位置获取的数据Firestore
。我在顶部的工具栏上有一个搜索栏,当我输入某些内容时,它会缩小搜索栏中的项目列表recyclerView
。
我有一个FloatingActionButton
这将带来一个BottomSheetDialogFragment
包含项目类别。当我从中选择一个类别时,recyclerView
“HomeFragment”中的 是根据所选类别填充的。到这里为止没有任何问题。
如果我在选择类别后进行搜索,它会毫无问题地缩小项目列表。当我从中选择“HomeFragment”时bottomNavigation
,从选择类别后BottomSheetDialogFragment
,搜索结果未显示。但是,如果我从bottomNavigation
选择任何其他底部菜单项后,但不转到BottomSheetDialogFragment
然后选择一个类别,那么搜索就没有问题了。仅当我选择类别然后通过点击底部菜单返回“HomeFragment”时才会发生这种情况。有人可以帮我找到并解决问题吗?
以下是我在“HomeFragment”中用于搜索的内容。
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
menu.clear() // THIS LINE OF CODE IS ADDED SO THAT WHEN WE SELECT A CATEGORY FROM THE BOTTOMSHEET THE MENU ITEMS WON'T DUPLICATE
inflater.inflate(R.menu.home_menu, menu)
super.onCreateOptionsMenu(menu, inflater)
val item = menu.findItem(R.id.my_search_bar)
val searchView = item?.actionView as SearchView
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
srchTempProductsList.clear()
if (query != null) {
if (query.isNotEmpty()) {
srchProductsList.forEach {
if (it.label.toLowerCase(Locale.getDefault()).contains(query)) {
srchTempProductsList.add(it)
}
binding.rvHomeItems.adapter?.notifyDataSetChanged()
}
if (srchTempProductsList.size == 0) {
showCustomAlertDialog()
}
} else {
srchTempProductsList.clear()
srchTempProductsList.addAll(srchProductsList)
binding.rvHomeItems.adapter?.notifyDataSetChanged()
}
}
return false
}
override fun onQueryTextChange(newText: String?): Boolean {
srchTempProductsList.clear()
val searchText = newText!!.toLowerCase(Locale.getDefault())
if (searchText.isNotEmpty()) {
srchProductsList.forEach {
if (it.label.toLowerCase(Locale.getDefault()).contains(searchText)) {
srchTempProductsList.add(it)
}
binding.rvHomeItems.adapter?.notifyDataSetChanged()
}
if (srchTempProductsList.size == 0) {
showCustomAlertDialog()
}
} else {
srchTempProductsList.clear()
srchTempProductsList.addAll(srchProductsList)
binding.rvHomeItems.adapter?.notifyDataSetChanged()
}
return false
}
})
}
我在“BottomSheetDialogFragment”中有以下内容将类别传递给“HomeFragment”
categoryAdapter.setOnClickListener(object :HomeCategoryListAdapter.OnClickListener{
override fun onClick(position: Int, category: Categories) {
val myFragment = HomeFragment()
val bundle = Bundle()
bundle.putString("category", category.category)
myFragment.arguments = bundle
fragmentManager?.beginTransaction()?.replace(R.id.nav_host_fragment,myFragment)?.commit()
dismiss()
}
})
以及以下内容中的onCreateView
'HomeFragment' 的
val bundle = this.arguments
if (bundle!=null) {
if (bundle.getString("category")!="All Products"){
filterCategory = bundle.getString("category")
}else{
filterCategory =null
}
}
这就是我获取“HomeFragment”中的产品列表的方式
fun getProductList() {
srchProductsList.clear()
srchTempProductsList.clear()
if (filterCategory!=null){
mFireStore.collection("prods")
.whereEqualTo("category",filterCategory)
.get()
.addOnCompleteListener {
if (it.isSuccessful) {
for (document in it.result) {
val product = document.toObject(Product::class.java)
product.product_id = document.id
srchProductsList.add(product)
}
} else {
}
srchTempProductsList.addAll(srchProductsList)
listProductBasedOnView()
}
.addOnFailureListener {
Log.d("Known Error", "This ....")
}
}else{
mFireStore.collection("prods")
.get()
.addOnCompleteListener {
if (it.isSuccessful) {
for (document in it.result) {
val product = document.toObject(Product::class.java)
product.product_id = document.id
srchProductsList.add(product)
}
} else {
}
srchTempProductsList.addAll(srchProductsList)
listProductBasedOnView()
}
.addOnFailureListener {
Log.d("Known Error", "This ...")
}
}
}