简体   繁体   English

如何在已经从 Firestore KOTLIN 获取 arrayList 的片段上实现 SearchView

[英]How to implement SearchView on fragment that is already fetching arrayList from firestore KOTLIN

Please, im trying to implement SearchView on a Fragment which is already fetching list from firestore,whenever i type a text into the searchview it doesnt notify the adapter, the list stays static.请,我试图在已经从firestore获取列表的片段上实现SearchView,每当我在searchview中输入文本时它不会通知适配器,列表保持static。 The list doesnt change at all and when i tried to redeclare the adapter in the fragement everything was fine till i run the emulator and type text in the searchview then the App crashes.该列表根本没有改变,当我尝试在片段中重新声明适配器时,一切都很好,直到我运行模拟器并在 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

} }

Below is the adapter下面是适配器

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)


}

Below is SearchView XML下面是 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

Create a function in adapter like below to refresh the list.在如下所示的适配器中创建 function 以刷新列表。

fun refreshList(displayList:ArrayList<PersonalCategory>){
 this.list.clear()
 this.list.addAll(displayList)
 notifyDataSetChanged()
}

Then change onQueryTextChange like this.然后像这样更改 onQueryTextChange 。 Its can use filter{} to filter matched items.它可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM