searchview avec retrofit android

Aug 28 2020

Je fais référence à ce tutoriel . Tout fonctionne bien sans erreur mais ce n'est pas un filtrage lorsque je tape quoi que ce soit. Il ne filtre pas la liste.

Je ne sais pas ce que je fais de mal.

Voici mon adaptateur et mon code d'activité.

Code adaptateur

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

Activité:

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

Merci d'avance.

Réponses

3 JeneaVranceanu Aug 28 2020 at 07:45

Les requêtes de vue de recherche ne donnent pas lieu à une liste filtrée car vous n'utilisez pas la liste filtrée .

onBindViewHolderet getItemCountutilise uniquement des Tablelistvariables. mFilteredListne contient que les résultats filtrés - ne les utilise pas.

Stockez la liste d'origine comme vous le faites actuellement, mais remplacez l'utilisation de Tablelistpar mFilteredListin onBindViewHolderet getItemCount. De plus, une mise à jour mineure setMovieListItemsest requise. mFilteredListest également déclaré non modifiable. performFilteringa également été amélioré un peu et n'est pas plus court. Tout est présenté ci-dessous:

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