[英]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.