searchview utilizzando Android retrofit

Aug 28 2020

Mi riferisco a questo tutorial . Tutto funziona bene senza errori ma non filtra quando digito qualcosa. Non sta filtrando l'elenco.

Non so cosa sto sbagliando.

Quello che segue è il mio adattatore e il codice attività.

Codice adattatore

class Table_Adapter(val context: Context) : RecyclerView.Adapter<Table_Adapter.MyViewHolder>(),Filterable {
    var mFilteredList: MutableList<Tabledata> = mutableListOf()
    var Tablelist: MutableList<Tabledata> = mutableListOf()
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {

        val view = LayoutInflater.from(parent.context).inflate(
                R.layout.table_recycle_item,
                parent,
                false
        )
        return MyViewHolder(view)
    }

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

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {

        holder.productname.text = Tablelist.get(position).name
        holder.producername.text = Tablelist.get(position).producer

        holder.productprice.text = Tablelist.get(position).cost.toString()

        Glide.with(context).load(Tablelist.get(position).product_images)
                .into(holder.image)
        holder.rate.setRating(Tablelist.get(position).rating.toFloat());
        holder.itemView!!.setOnClickListener {
            val context:Context=holder.itemView.context
            val i=Intent(
                    context,
                    Product_details::class.java
            )
            i.putExtra("id", Tablelist.get(position).id.toString())
            i.putExtra("image", Tablelist.get(position).product_images)
            context.startActivity(i)
        }
    }

    fun setMovieListItems(movieList: MutableList<Tabledata>){
        this.Tablelist = movieList;
        notifyDataSetChanged()
    }

    class MyViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView!!) {

        val productname: TextView = itemView!!.findViewById(R.id.title)
        val producername: TextView = itemView!!.findViewById(R.id.title1)
        val productprice: TextView = itemView!!.findViewById(R.id.title2)
        val rate: RatingBar=itemView!!.findViewById(R.id.ratingbar)
        val image: ImageView = itemView!!.findViewById(R.id.image)
    }

    override fun getFilter(): Filter {
        return object : Filter() {
            override fun performFiltering(charSequence: CharSequence): FilterResults? {
                val charString = charSequence.toString()
                if (charString.isEmpty()) {
                    mFilteredList = Tablelist
                } else {
                    val filteredList: MutableList<Tabledata> = ArrayList()
                    for (androidVersion in Tablelist) {
                        /* if (androidVersion.name.toLowerCase()
                                 .contains(charString)
                         ) {
                            filteredList.add(androidVersion)
                         }*/
                        if (androidVersion.name.toLowerCase()
                                        .contains(charString.toLowerCase()) || androidVersion.name
                                        .contains(charSequence)
                        ) {
                            filteredList.add(androidVersion)
                        }
                    }
                    mFilteredList = filteredList
                }
                val filterResults = FilterResults()
                filterResults.values = mFilteredList
                return filterResults
            }

            override fun publishResults(charSequence: CharSequence?, filterResults: FilterResults) {
                mFilteredList = filterResults.values as MutableList<Tabledata>
                notifyDataSetChanged()
            }
        }
    }
}

Attività:

class Tables : AppCompatActivity() {
    lateinit var recyclerView: RecyclerView
    lateinit var recyclerAdapter: Table_Adapter
    var Tablelist : MutableList<Tabledata> = mutableListOf()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.table_activity)
        var mActionBarToolbar = findViewById<androidx.appcompat.widget.Toolbar>(R.id.toolbartable);
        setSupportActionBar(mActionBarToolbar);
        if (getSupportActionBar() != null){
            getSupportActionBar()?.setDisplayHomeAsUpEnabled(true);
            getSupportActionBar()?.setDisplayShowHomeEnabled(true);
            getSupportActionBar()?.setHomeAsUpIndicator(R.drawable.ic_keyboard_arrow_left_black_24dp);
            getSupportActionBar()?.setTitle((Html.fromHtml("<font color=\"#FFFFFF\">" + getString(R.string.Tables) + "</font>")));
        }
        recyclerView = findViewById(R.id.recyleview)
        recyclerAdapter = Table_Adapter(this)
        recyleview.layoutManager = LinearLayoutManager(this)
        recyclerView.addItemDecoration(
                DividerItemDecoration(
                        recyclerView.context,
                        DividerItemDecoration.VERTICAL
                )
        )
        recyleview.adapter = recyclerAdapter
        RetrofitClient.instancetable.getAllPhotos(product_category_id = "1", value = 1).enqueue(
                object : Callback<Table_response> {
                    override fun onFailure(call: Call<Table_response>, t: Throwable) {
                        Toast.makeText(applicationContext, "falied", Toast.LENGTH_LONG).show()
                    }
                    override fun onResponse(
                            call: Call<Table_response>,
                            response: Response<Table_response>
                    ) {

                        if (response?.body() != null) {

                            recyclerAdapter.setMovieListItems((response.body()?.data as MutableList<Tabledata>?)!!)
                        }
                    }

                })
    }
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            android.R.id.home -> {
                NavUtils.navigateUpFromSameTask(this)
                true
            }
            else -> super.onOptionsItemSelected(item)
        }
    }
    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(R.menu.menu_main, menu)
        val search: MenuItem = menu.findItem(R.id.search)
        val searchView: SearchView = MenuItemCompat.getActionView(search) as SearchView
        search(searchView)
        return true
    }
    override fun onBackPressed() {
        super.onBackPressed()
    }
    private fun search(searchView: SearchView) {
        searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String): Boolean {
                return false
            }

            override fun onQueryTextChange(newText: String): Boolean {
                recyclerAdapter.getFilter().filter(newText)
                return true
            }
        })
    }
}

Grazie in anticipo.

Risposte

3 JeneaVranceanu Aug 28 2020 at 07:45

Le query di visualizzazione della ricerca non producono un elenco filtrato perché non si utilizza l'elenco filtrato .

onBindViewHoldere getItemCountutilizza solo Tablelistvariabili. mFilteredListcontiene solo risultati filtrati, non li utilizza.

Memorizza l'elenco originale come lo fai attualmente, ma sostituisci l'uso di Tablelistcon mFilteredListin onBindViewHoldere getItemCount. Inoltre, setMovieListItemsè richiesto un aggiornamento minore in . mFilteredListè anche dichiarato immutabile. performFilteringinoltre è stato leggermente migliorato e non è più corto. Tutto è presentato di seguito:

class Table_Adapter() : RecyclerView.Adapter<Table_Adapter.MyViewHolder>(), Filterable {

    var mFilteredList: List<Tabledata> = listOf()
    var tableList: MutableList<Tabledata> = mutableListOf()

    ...

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

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val tableItem = mFilteredList.get(position)

        holder.productname.text = tableItem.name
        holder.producername.text = tableItem.producer

        holder.productprice.text = tableItem.cost.toString()

        Glide.with(holder.itemView!!.context).load(tableItem.product_images)
                .into(holder.image)
        
        holder.rate.setRating(tableItem.rating.toFloat());
        holder.itemView!!.setOnClickListener {
            val context: Context = holder.itemView.context
            val i = Intent(
                    context,
                    Product_details::class.java
            )
            i.putExtra("id", tableItem.id.toString())
            i.putExtra("image", tableItem.product_images)
            context.startActivity(i)
        }
    }

    fun setMovieListItems(movieList: MutableList<Tabledata>) {
        tableList = movieList.toMutableList() // makes a copy
        mFilteredList = movieList
        notifyDataSetChanged()
    }

    ...

    override fun getFilter(): Filter {
        return object : Filter() {
            override fun performFiltering(charSequence: CharSequence): FilterResults? {
                val queryString = charSequence.toString()

                val filterResults = FilterResults()
                filterResults.values =
                        if (queryString.isEmpty()) {
                            tableList
                        } else {
                            tableList.filter {
                                it.name.contains(queryString, ignoreCase = true) || it.name.contains(charSequence)
                            }
                        }
                return filterResults
            }

            override fun publishResults(charSequence: CharSequence?, filterResults: FilterResults) {
                mFilteredList = filterResults.values
                notifyDataSetChanged()
            }
        }
    }
}