SearchView does not return values from RecyclerView of Array

39 views Asked by At

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()
        }
    }
}

}

0

There are 0 answers