When I type something in SearchView everything works fine but when I need to delete letters or write something else then SearchView does not react on RecyclerViews values. How to make SearchView to return values when I press backspace?
MainActivity.kt
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
private lateinit var binding: ActivityMainBinding
private var adapter: MyAdapter? = null
private val list = ArrayList<ListItem>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.navView.setNavigationItemSelectedListener(this)
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
list.addAll(
fillArrays(
resources.getStringArray(R.array.fish_name),
resources.getStringArray(R.array.content),
getImageId(R.array.fish_image_array)
)
)
findViewById<androidx.appcompat.widget.Toolbar>(R.id.toolbarOpen).setOnClickListener {
binding.dLayout.openDrawer(binding.navView)
}
val rcView = findViewById<RecyclerView>(R.id.rcView)
rcView.layoutManager = LinearLayoutManager(this)
adapter = MyAdapter(list, this)
rcView.adapter = adapter
rcView.layoutManager = GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false)
val sView = findViewById<SearchView>(R.id.icSearch)
sView.setOnQueryTextListener(object: SearchView.OnQueryTextListener{
override fun onQueryTextSubmit(query: String?): Boolean {
return false
}
override fun onQueryTextChange(newText: String?): Boolean {
if(newText.isNullOrBlank()){
adapter!!.filter.filter("")
} else {
adapter!!.filter.filter(newText)
}
return true
}
})
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.fish ->
adapter?.updateAdapter(
fillArrays(
resources.getStringArray(R.array.fish_name),
(resources.getStringArray(R.array.content)),
getImageId(R.array.fish_image_array)
)
)
R.id.location ->
adapter?.updateAdapter(
fillArrays(
resources.getStringArray(R.array.location_name),
(resources.getStringArray(R.array.location_content)),
getImageId(R.array.location_image_array)
)
)
}
binding.dLayout.closeDrawer(GravityCompat.START)
return true
}
private fun fillArrays(
titleArray: Array<String>, contentArray: Array<String>,
imageArray: IntArray
): List<ListItem> {
val listItemArray = ArrayList<ListItem>()
for (n in titleArray.indices) {
val listItem = ListItem(imageArray[n], titleArray[n], contentArray[n])
listItemArray.add(listItem)
}
return listItemArray
}
private fun getImageId(imageArrayId: Int): IntArray {
val tArray: TypedArray = resources.obtainTypedArray(imageArrayId)
val count = tArray.length()
val ids = IntArray(count)
for (i in ids.indices) {
ids[i] = tArray.getResourceId(i, 0)
}
tArray.recycle()
return ids
}
}
MyAdapter.kt
class MyAdapter(listArray: ArrayList, context: Context): RecyclerView.Adapter<MyAdapter.ViewHolder>(), Filterable{
private var listArrayR = listArray
private var contextR = context
inner class ViewHolder(view: View): RecyclerView.ViewHolder(view){
private val tvTitle = view.findViewById<TextView>(R.id.tvTitle2)
private val tvContent = view.findViewById<TextView>(R.id.tvContent2)
private val imFish = view.findViewById<ImageView>(R.id.imFish)
fun bind(listItem: ListItem, context: Context){
tvTitle.text = listItem.titleText
tvContent.text = listItem.contentText
imFish.setImageResource(listItem.imageId)
itemView.setOnClickListener{
val i = Intent(context, ContentActivity::class.java).apply {
putExtra("title", tvTitle.text.toString())
putExtra("content", tvContent.text.toString())
putExtra("image", listItem.imageId)
}
context.startActivity(i)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(contextR)
return ViewHolder(inflater.inflate(R.layout.item_layout, parent, false))
}
override fun getItemCount(): Int {
return listArrayR.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val listItem = listArrayR[position]
holder.bind(listItem, contextR)
}
fun updateAdapter(listArray: List<ListItem>){
listArrayR.clear()
listArrayR.addAll(listArray)
notifyDataSetChanged()
}
override fun getFilter(): Filter {
return object: Filter(){
override fun performFiltering(constraint: CharSequence?): FilterResults {
val filterResults = FilterResults()
if(constraint.isNullOrBlank()){
filterResults.values = listArrayR
} else {
val filtered = listArrayR.filter {
it.titleText.contains(constraint, ignoreCase = true)
}
filterResults.values = filtered
}
return filterResults
}
override fun publishResults(constraint: CharSequence?, results: FilterResults?){
listArrayR = results?.values as ArrayList<ListItem>
notifyDataSetChanged()
}
}
}
}