Bonjour,
je souhaiterais avoir de l'aide. Pour réaliser un formulaire de recherche j'ai fait ceci:
quand, j'écris dans le formulaire je n'ai aucun résultat; j'ai testé le debug, le text saisi arrive bien dans le filter mais il n y a pas de filtre a l ecran.
si vous pouvez m'aider ....Merci d'avance

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package ga.idevtech.rapidfacture.adapter
 
import android.net.Uri
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Filter
import android.widget.Filterable
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import ga.idevtech.rapidfacture.*
import java.util.*
import kotlin.collections.ArrayList
 
class ArticleAdapter(
        val context: MainActivity,
        list: ArrayList<ArticleModel>,
        private val layoutId:Int) : RecyclerView.Adapter<ArticleAdapter.viewHolder>(), Filterable {
        private val articleList = list
        private val searchList = articleList
 
    //Boite pour ranger tous les composant a controler
    class viewHolder(view: View): RecyclerView.ViewHolder(view){
        val Imagearticle = view.findViewById<ImageView>(R.id.item_image)
        val Nomarticle: TextView? = view.findViewById(R.id.name_item)
        val Descriptionarticle: TextView? = view.findViewById(R.id.description_item)
        val Prixarticle: TextView? = view.findViewById(R.id.prix_item)
 
 
    }
 
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): viewHolder {
        val view = LayoutInflater
            .from(parent.context)
            .inflate(layoutId, parent,false)
 
        return viewHolder(view)
   }
 
    override fun onBindViewHolder(holder: viewHolder, position: Int) {
        //recuperer les information de l'article
        val currentArticle = articleList[position]
        //recuperer le repository
        val repo = ArticleRepository()
        //utiliser glide pour recupérer l'image à partir
        Glide.with(context).load(Uri.parse(currentArticle.imageUrl)).into(holder.Imagearticle)
     //   Log.i("DEBUGAGE", "le onBindViewHolder" + position)
        //Mettre le nom de l'article
        holder.Nomarticle?.text = currentArticle.nom
        //Mettre la description de l'article
        holder.Descriptionarticle?.text = currentArticle.description
        //Mettre la description de l'article
        holder.Prixarticle?.text = currentArticle.prix.toString()
 
        //interaction lors du clic sur un article
        holder.itemView.setOnClickListener {
                //afficher la popup
                ArticlePopop(this, currentArticle).show()
        }
 
    }
 
 
    override fun getItemCount(): Int = articleList.size
 
 
 
   override  fun getFilter(): Filter {
        return object : Filter() {
            override fun performFiltering(constraint: CharSequence): FilterResults {
                val filteredList = ArrayList<ArticleModel>()
 
                if (constraint.toString() == "") {
                    filteredList.addAll(searchList)
                    Log.d("testttttttttttttt1", constraint.toString())
                }
                else {
                    val filterPattern = constraint.toString().toLowerCase(Locale.ROOT).trim()
 
                    searchList.forEach {
                        if (it.nom.toLowerCase(Locale.ROOT).contains(filterPattern)) {
                            filteredList.add(it)
                          //  Log.d("testttttttttttttt2", constraint.toString())
                            Log.d("testttttttttttttt3", it.nom.toString())
                        }
                    }
                }
 
                val result = FilterResults()
                result.values = filteredList
 
                return result
            }
 
            override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
                articleList.clear()
                articleList.addAll(results!!.values as List<ArticleModel>)
                notifyDataSetChanged()
            }
        }
    }
 
}

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package ga.idevtech.rapidfacture.fragments
 
import android.os.Bundle
import android.util.Log
import android.view.*
import android.view.inputmethod.EditorInfo
import androidx.appcompat.widget.SearchView
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.RecyclerView
import ga.idevtech.rapidfacture.ArticleModel
import ga.idevtech.rapidfacture.ArticleRepository.Singleton.articleList
import ga.idevtech.rapidfacture.MainActivity
import ga.idevtech.rapidfacture.R
import ga.idevtech.rapidfacture.adapter.ArticleAdapter
import ga.idevtech.rapidfacture.adapter.ArticleItemDecoration
 
class ArticleFragment(
        private val context:MainActivity
): Fragment() {
 
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater?.inflate(R.layout.fragment_article, container, false)
 
       // recuperer le recyclerview
      //  val horizontalRecyclerView = view.findViewById<RecyclerView>(R.id.horizontal_recycler_view)
      //  horizontalRecyclerView.adapter = ArticleAdapter(context, articleList, R.layout.item_horizontal_article)
        //Recuperer le second recyclerView
        val verticalRecyclerView = view.findViewById<RecyclerView>(R.id.vertical_recycler_view)
        verticalRecyclerView.adapter = ArticleAdapter(context, articleList,R.layout.item_vertical_article)
 
        verticalRecyclerView.addItemDecoration(ArticleItemDecoration())
 
        return view
    }
 
 
}

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
package ga.idevtech.rapidfacture
 
class ArticleModel (
        val id: String = "art0",
    val nom: String = "Nom Article",
    val description: String = "Description de l'article",
    val prix: Long = 250,
    val imageUrl: String = "http://via.placeholder.com/300.png",
    var liked: Boolean = false
 
)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package ga.idevtech.rapidfacture
 
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.inputmethod.EditorInfo
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatDelegate
import androidx.appcompat.widget.SearchView
import androidx.fragment.app.Fragment
import com.google.android.material.bottomnavigation.BottomNavigationView
import ga.idevtech.rapidfacture.ArticleRepository.Singleton.articleList
import ga.idevtech.rapidfacture.adapter.ArticleAdapter
import ga.idevtech.rapidfacture.fragments.*
 
class MainActivity : AppCompatActivity() {
    private lateinit var adapter: ArticleAdapter
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
       // AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
 
       adapter = ArticleAdapter(this, articleList, R.layout.item_vertical_article)
 
        //importer la boutomview
        val navigationView = findViewById<BottomNavigationView>(R.id.navigation_view_bottom)
        navigationView.setOnNavigationItemSelectedListener {
            when(it.itemId)
            {
                R.id.home_article ->{
                    loadFragment(ArticleFragment(this), R.string.page_title_article)
                    return@setOnNavigationItemSelectedListener true
                }
                R.id.home_client->{
                    loadFragment(ClienFragment(this), R.string.page_title_client)
                    return@setOnNavigationItemSelectedListener true
                }
                R.id.home_add->{
                    loadFragment(AddArticleFragment(this), R.string.page_add_article)
                    return@setOnNavigationItemSelectedListener true
                }
               /** R.id.home_devis->{
                    loadFragment(DevisFragment(this), R.string.page_title_devis)
                    return@setOnNavigationItemSelectedListener true
                }
                R.id.home_facture->{
                    loadFragment(FactureFragment(this), R.string.page_title_facture)
                    return@setOnNavigationItemSelectedListener true
                }**/
 
                else ->false
            }
 
        }
 
        loadFragment(ArticleFragment(this), R.string.page_title_article)
 
 
    }
    private fun loadFragment(fragment: Fragment, string: Int) {
 
        //charger notre repository
        val repo = ArticleRepository()
        //Actualiser le titre de la page
        findViewById<TextView>(R.id.page_title).text = resources.getString(string)
 
        //Mettre a jour les donnees
        repo.updateData {
            //injecter le fragment dans la boite (fragment_contenaire)
            val transaction = supportFragmentManager.beginTransaction()
            transaction.replace(R.id.fragment_container, fragment)
            transaction.addToBackStack(null)
            transaction.commit()
        }
 
    }
    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        val inflater: MenuInflater = menuInflater
        inflater.inflate(R.menu.menu_main, menu)
 
        val item = menu?.findItem(R.id.searchView_MenuMain)
        val searchView: SearchView = item?.actionView as SearchView
 
        searchView.imeOptions = EditorInfo.IME_ACTION_DONE
 
        searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String?): Boolean {
                return false
            }
 
            override fun onQueryTextChange(newText: String?): Boolean {
 
                adapter.filter.filter(newText)
               // Toast.makeText(getApplicationContext(), "Hello 1", Toast.LENGTH_LONG).show();
               // Log.d("testttttttttttttt", newText)
                return false
            }
        })
 
        return true
    }
 
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return true
    }
 
 
}

Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
 
    <item
        android:id="@+id/searchView_MenuMain"
        android:title="search"
        android:icon="@drawable/ic_search"
        app:showAsAction="ifRoom|collapseActionView"
        app:actionViewClass="androidx.appcompat.widget.SearchView" />
 
</menu>

Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="@dimen/item_margin">
 
    <androidx.cardview.widget.CardView
        android:id="@+id/cardView"
        android:layout_width="80dp"
        android:layout_height="80dp"
        app:cardCornerRadius="7dp"
        app:cardElevation="4dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
 
        <ImageView
            android:id="@+id/item_image"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"
            android:src="@drawable/trending1" />
 
    </androidx.cardview.widget.CardView>
 
    <View
        android:id="@+id/view_separation"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
 
    <TextView
        android:id="@+id/name_item"
        style="@style/SubtitleTextStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="@dimen/item_margin"
        android:text="@string/nom_article"
        app:layout_constraintBottom_toBottomOf="@+id/view_separation"
        app:layout_constraintStart_toEndOf="@+id/cardView" />
 
    <TextView
        android:id="@+id/description_item"
        style="@style/DefaultTextStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="@dimen/item_margin"
        android:text="@string/description_article"
        app:layout_constraintStart_toEndOf="@+id/cardView"
        app:layout_constraintTop_toBottomOf="@+id/view_separation" />
 
    <TextView
        android:id="@+id/prix_item"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:scaleType="centerCrop"
        android:layout_marginRight="60dp"
        android:text="@string/prix_article"
        app:layout_constraintBottom_toBottomOf="@+id/cardView"
        app:layout_constraintEnd_toEndOf="@+id/view_separation"
        app:layout_constraintTop_toTopOf="@+id/cardView" />
 
    <View
        android:id="@+id/view_separation_bas"
        android:layout_width="match_parent"
        android:layout_height="10dp"
        android:visibility="invisible"
        android:background="@color/black"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
 
 
</androidx.constraintlayout.widget.ConstraintLayout>

Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <!--
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/horizontal_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:orientation="horizontal"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
-->
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/vertical_recycler_view"
        android:layout_marginTop="@dimen/item_margin"
        android:overScrollMode="never"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
 
 
 
 
</LinearLayout>