How to use a SearchView on a RecyclerView List

48 Views Asked by At

For my app I use a recycler view list that displays Pizza Restaurants that include its name, location, and rating. In it I want to use a search view that can look up the restaurant by its name. Every time I try to run it I keep getting errors about my search view. I am trying to get my SearchView to work, but it keeps on getting errors every time I launch the app.

This is my RV.Adapter:

`

class PizzaAdapter(private var PizzaList: List<Pizza>):
    RecyclerView.Adapter<PizzaAdapter.PizzaViewHolder>()
{
    private lateinit var listener: PizzaAdapterListener
    inner class PizzaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val textViewName: TextView = itemView.findViewById(R.id.textViewName)
        val textViewLocation: TextView = itemView.findViewById(R.id.textViewLocation)
        val ratingBar: RatingBar = itemView.findViewById(R.id.ratingBar)
    } // end MyViewHolder

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PizzaViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.activity_current_pizza_palor_list, parent, false)
        return PizzaViewHolder(view)
    }

    override fun onBindViewHolder(holder: PizzaViewHolder, position: Int) {
        val pizza = PizzaList[position]
        holder.textViewName.text = pizza.name
        holder.textViewLocation.text = pizza.location
        holder.ratingBar.rating = pizza.rate!!?.toFloat()!!

    }

    override fun getItemCount(): Int {
        return PizzaList.size
    }

    fun setData(list: List<Pizza>) {
        PizzaList = list
        notifyDataSetChanged()
    }

    interface PizzaAdapterListener {
        fun onClick(position: Int)
    }

    fun getFilter(): Filter {
        return object : Filter() {
            override fun performFiltering(constraint: CharSequence?): FilterResults {
                val filteredList = mutableListOf<Pizza>()

                if (constraint == null || constraint.isEmpty()) {
                    filteredList.addAll(PizzaList)
                } else {
                    val filterPattern = constraint.toString().toLowerCase().trim()

                    for (item in PizzaList) {
                        if (item.name.toLowerCase().contains(filterPattern)) {
                            filteredList.add(item)
                        }
                    }
                }

                val results = FilterResults()
                results.values = filteredList
                return results
            }

            override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
                PizzaList = results?.values as List<Pizza>
                notifyDataSetChanged()
            }

    fun setOnItemClickListener(_listener: PizzaAdapterListener) {
        listener = _listener
    }
}
}
}

`

This is my MainActivity which I am trying to use SearchView:

`

class MainActivity : AppCompatActivity() {
private lateinit var recyclerViewPizza: RecyclerView
private lateinit var data : ArrayList<Pizza>
private lateinit var pizzaAdapter : PizzaAdapter
private lateinit var searchView : SearchView
@SuppressLint("MissingInflatedId")
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    recyclerViewPizza = findViewById<RecyclerView>(R.id.recyclerViewPizza)
    recyclerViewPizza.layoutManager = LinearLayoutManager(this)

    data = ArrayList<Pizza>()
    data.add(Pizza("Pizza Hut", "Deer Park", 3.1))
    data.add(Pizza("Papa Johns", "Deer Park", 3.9))
    data.add(Pizza("Richie's Pizza", "Commack", 4.4))
    data.add(Pizza("Domino's Pizza", "Deer Park", 4.2))

    val searchView = findViewById<SearchView>(R.id.searchView)

    searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(query: String?): Boolean {
            return false
        }

        override fun onQueryTextChange(newText: String?): Boolean {
            filter(newText)
            return true
        }
    })
}

private fun filter(query: String?) {
    val filteredList = mutableListOf<Pizza>()
    if (query.isNullOrEmpty()) {
        filteredList.addAll(data)
    } else {
        val filterPattern = query.trim()
        for (item in data) {
            if (item.name.contains(filterPattern, true)) {
                filteredList.add(item)
            }
        }
    }
}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    val inflater = menuInflater
    inflater.inflate(R.menu.toolmenu, menu)
    return true
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.getItemId()) {
        R.id.add_item->{
            val intent = Intent(this@MainActivity, AddActivity::class.java)
            startActivity(intent)
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}
}

`

I have tried using documentation and finding tutorials online to help but none of them have worked for my case. So far my app refuses to even open now and I have also tried going back and fourth again to check my code.

0

There are 0 best solutions below