[英]How to implement SearchView on fragment that is already fetching arrayList from firestore KOTLIN
请,我试图在已经从firestore获取列表的片段上实现SearchView,每当我在searchview中输入文本时它不会通知适配器,列表保持static。 该列表根本没有改变,当我尝试在片段中重新声明适配器时,一切都很好,直到我运行模拟器并在 searchview 中键入文本然后应用程序崩溃。
class PersonalFragment : BaseFragment() {
val list = ArrayList<PersonalCategory>()
val displayList = ArrayList<PersonalCategory>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// If we want to use the option menu in fragment we need to add it.
setHasOptionsMenu(true)
}
// END
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val root = inflater.inflate(R.layout.fragment_personal, container, false)
return root
}
// Override the onOptionItemSelected function and handle the action items init.
// START
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val id = item.itemId
when (id) {
R.id.action_create_personal_cat -> {
// Launch the Create Personal Category Activity on click of action item.
// START
startActivity(Intent(activity, CreatePersonalCategoryActivity::class.java))
// END
return true
}
}
return super.onOptionsItemSelected(item)
}
// END
override fun onResume() {
super.onResume()
getPersonalListFromFireStore()
}
//Getting the list by call the firestore class
private fun getPersonalListFromFireStore() {
// Show the progress dialog.
showProgressDialog(resources.getString(R.string.please_wait))
// Call the function of Firestore class.
FirestoreClass().getPersonalCategoryList(this@PersonalFragment)
}
fun successPersonalListFromFireStore(pcategoryList: ArrayList<PersonalCategory>){
// Hide Progress dialog.
hideProgressDialog()
if (pcategoryList.size > 0) {
rv_my_personalCate_items.visibility = View.VISIBLE
tv_no_personalCate_found.visibility = View.GONE
rv_my_personalCate_items.layoutManager = LinearLayoutManager(activity)
rv_my_personalCate_items.setHasFixedSize(true)
val adapterPersonalCates =
MyPersonalCategoryListAdapter(requireActivity(), pcategoryList, this@PersonalFragment)
// END
rv_my_personalCate_items.adapter = adapterPersonalCates
val editSwipeHandler = object : SwipeToEditCallback(requireActivity()) {
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
val adapter = rv_my_personalCate_items.adapter as MyPersonalCategoryListAdapter
adapter.notifyEditItem(
this@PersonalFragment,
viewHolder.adapterPosition
)
}
}
val editItemTouchHelper = ItemTouchHelper(editSwipeHandler)
editItemTouchHelper.attachToRecyclerView(rv_my_personalCate_items)
} else {
rv_my_personalCate_items.visibility = View.GONE
tv_no_personalCate_found.visibility = View.VISIBLE
}
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.create_personal_cat_top_menu, menu)
val ic_search= menu!!.findItem(R.id.action_search_personal_cat)
val searchView =ic_search.actionView as SearchView
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener{
override fun onQueryTextSubmit(filterString: String): Boolean {
// search button submit
return true
}
override fun onQueryTextChange(newText: String): Boolean {
// search text changed
if(newText!!.isNotEmpty()){
displayList.clear()
val search = newText.lowercase(Locale.getDefault())
list.forEach {
if(it.personal_category_title.lowercase(Locale.getDefault()).contains(search)){
displayList.add(it)
}
}
rv_my_personalCate_items.adapter!!.notifyDataSetChanged()
}
else{
displayList.clear()
displayList.addAll(list)
rv_my_personalCate_items.adapter!!.notifyDataSetChanged()
}
return true
}
})
super.onCreateOptionsMenu(menu, inflater)
}
// END
//END
}
下面是适配器
open class MyPersonalCategoryListAdapter(private val context: Context,
private var list: ArrayList<PersonalCategory>,
private val fragment: PersonalFragment
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return MyViewHolder(
LayoutInflater.from(context).inflate(
R.layout.item_list_personal_categories_layout,
parent,
false
)
)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val model = list[position]
if (holder is MyViewHolder) {
holder.itemView.tv_perscate_name.text = model.personal_category_title
// END
holder.itemView.setOnClickListener {
// Launch Academic Task Screen details screen.
val intent = Intent(context, PersonalTaskActivity::class.java)
intent.putExtra(Constants.EXTRA_PERSONAL_CATEGOTY_ID, model.personal_category_id)
context.startActivity(intent)
}
}
}
override fun getItemCount(): Int {
return list.size
}
class MyViewHolder(view: View) : RecyclerView.ViewHolder(view)
}
下面是 SearchView XML
<item
android:id="@+id/action_search_personal_cat"
android:icon="@drawable/ic_search"
android:title="@string/action_search_academic"
app:showAsAction="always"
app:actionViewClass="androidx.appcompat.widget.SearchView"/>
<item
在如下所示的适配器中创建 function 以刷新列表。
fun refreshList(displayList:ArrayList<PersonalCategory>){
this.list.clear()
this.list.addAll(displayList)
notifyDataSetChanged()
}
然后像这样更改 onQueryTextChange 。 它可以使用filter{}
过滤匹配的项目。
override fun onQueryTextChange(newText: String): Boolean {
// search text changed
if(!newText.isNullOrEmpty()){
displayList.clear()
val search = newText.lowercase(Locale.getDefault())
val filteredList = list.filter{
it.personal_category_title.lowercase(Locale.getDefault()).contains(search)
}
(rv_my_personalCate_items.adapter as? MyPersonalCategoryListAdapter)?.refreshList(filteredList)
}
else{
displayList.clear()
displayList.addAll(list)
(rv_my_personalCate_items.adapter as? MyPersonalCategoryListAdapter)?.refreshList(displayList)
}
return true
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.