Récupération de données depuis une parse database

Bonjour , je suis en train de construire une application sous Android. avant de m’avancer plus loin dans le projet, j’ai fait une recycler view avec la récupération de données dans un tableau, comme expliqué dans le cours de maxime (TV Characters). Ensuite j’ai suivi la partie 7.4 pour l’importation de donnés depuis une base.
n’tilisant pas realm, mais la base Back4App, je n’arrive pas à construire mon adaptateur, pour récupérer les données de ma base et intégrer le résultat dans les champs de ma recyclerView. Pour explication dans ma base j’ai une class " MenuGeneral" et dans cette class je veux récupérer les titres qui sont dans une colonne « nom » et les faire correspondre au champ texte de ma recycler.
est ce quelqu’un a déjà fait la même chose et pourrait m’aider?.
la relation entre Android et ma base est ok.
par avance merci si vous avez des idées.

Normalement l’adaptateur doit pouvoir marcher avec n’importe quelle source de données.
Il te suffit de d’abord récupérer tes données depuis Back4App, ce qui je suppose, sera asynchrone.
Puis, une fois que tu as récupéré tes données tu recharges les données de ton adaptateur en appelant la fonction notifiyDatasetChanged() (https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.Adapter#notifyDataSetChanged()) sur ton Adapter pour le prévenir qu’il doit relancer la phase de questions en se basant sur les infos téléchargées.
Si ton soucis vient du chargement des données via Back4App/Parse je ne pourrais pas forcément t’aider sur cette partie là (je ne m’en suis jamais servi), mais peut être que @Samir aurait une idée là dessus.

Salut @Fab,

As tu solutionner ton problème ?

Bonjour Samir

non, je dois avoué être un peu largué. j’ai essayé en regardanr cette doc https://docs.parseplatform.org/android/guide/#retrieving-objects, plus pour java que kotlin, mais sans succès. connais tu ce sujet?

Oui j’ai joué pas mal de temps avec Parse et je t’avoue que j’apprécie beaucoup cette solution pour sa simplicité d’utilisation. Ce que je te conseille de faire dans un premier temps est de créer tes tables sous forme d’objets Java.
Ces classes héritent de PFObject. Cela te facilitera grandement la manipulation vu que maintenant tu vas jouer avec tes objets directement. Une table voiture (coté Parse) = l’objet Voiture(), je trouve ça génial.

Je t’invite à lire le doc sur le subclassing https://docs.parseplatform.org/android/guide/#subclasses

Je t’avoue que je n’ai jamais fait de Java ni d’Android (je deteste Android :rofl:) mais d’après ce que j’ai vu cela semble assé similaire à IOS. Nous allons y aller pas à pas.

J’ai également utilisé Parse pour mon Appli en Swift, sans souci, mais je dois avoué que sur Android je galère un peu sur la méthode. bon je vais de nouveau me plonger dans la doc, car c’est pauvre en exemple sur internet et si je trouve une solution je t’en ferai part, on ne sait jamais :wink:

OK pas de souci :+1:. N’hésite pas

Bon je suis toujours dans la galère, bien que j’ai lu un maximum de docs sur le sujet, enfin le peu qu’il y a. mon recycler view n’affiche pas les données. ci dessous mes différents éléments peu être quee vous auriez une idée de ce qu’il manque, ou que je fais mal.

ma sous classe

@ParseClassName("MenuGeneral")
open class PFmenuGeneral: ParseObject() {
          var nom:String = "nom"

        var menuGeneralList: String?
        get()=getString("nom")
        set(value) {
            if(value!=null) {
                put(nom,value)
            }
        }

        fun getNom(block: (nom: List<PFmenuGeneral>?,exception: Exception?) -> Unit) {
        val query=ParseQuery.getQuery(PFmenuGeneral::class.java)
        query.orderByAscending("order")
        query.include("pointerPageVente")
        query.findInBackground { objects,error ->
            if(error==null) {
                for (nom in objects) {
                    Log.d("DEBUG", nom.getString ("nom"))
                }
            } else {
                Log.d("item","Error: " + error!!.message)
            }
        }
    }
}

mon adapter

class MenuGeneralAdapter(private val menuList: List<PFmenuGeneral>) : 
       RecyclerView.Adapter<MenuGeneralAdapter.MenuGeneralViewHolder>() {


    fun onMenuGeneralClick(index:Int, context:Context){
        val nomMenu: PFmenuGeneral = menuList[index]
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MenuGeneralViewHolder {
        // 1 - chargement de la vue

        val rootView = LayoutInflater.from(parent.context).inflate(R.layout.cell_menugeneral,parent, false)

        // 2 - création du view holder pour le contrôle de la vue

        val holder = MenuGeneralViewHolder(rootView)

        // 3 - retourner le view holder
        return holder
    }

    override fun onBindViewHolder(holder: MenuGeneralViewHolder,position: Int) {
        // 1 - obtenir la valeur(holder)
            val menuGeneral = menuList[position]


        //  2 - envoi des infos dans la cellule(position)
        holder.fillWithPFmenuGeneral(menuGeneral = menuGeneral)

    }

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

    inner class MenuGeneralViewHolder(rootView: View) : RecyclerView.ViewHolder(rootView),
        View.OnClickListener {
        private val ui_nom = rootView.ui_nom

        init {
            rootView.setOnClickListener(this)
        }


        fun fillWithPFmenuGeneral(menuGeneral: PFmenuGeneral){
            ui_nom.text = menuGeneral.nom

        }

        override fun onClick(v: View?) {
            if (v != null) {
                onMenuGeneralClick(adapterPosition, v.context)
            }
        }

    }
}

Mon activité

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottom_navigation)

        bottomNavigationView.selectedItemId = R.id.ic_home

        bottomNavigationView.setOnNavigationItemSelectedListener(BottomNavigationView.OnNavigationItemSelectedListener { menuItem ->
            when (menuItem.itemId) {
                R.id.ic_home -> return@OnNavigationItemSelectedListener true

                R.id.ic_convertisseur -> {
                    startActivity(Intent(applicationContext, ConvertisseurActivity::class.java))
                    overridePendingTransition(0, 0)
                    return@OnNavigationItemSelectedListener true
                }

                R.id.ic_recherche -> {
                    startActivity(Intent(applicationContext, SearchActivity::class.java))
                    overridePendingTransition(0, 0)
                    return@OnNavigationItemSelectedListener true
                }
                R.id.ic_favoris -> {
                    startActivity(Intent(applicationContext,FavoritesActivity::class.java))
                    overridePendingTransition(0, 0)
                    return@OnNavigationItemSelectedListener true
                }
                R.id.ic_plus -> {
                    startActivity(Intent(applicationContext, MoreActivity::class.java))
                    overridePendingTransition(0, 0)
                    return@OnNavigationItemSelectedListener true
                }
            }
            false
        })


        ui_menugenerallist.adapter = MenuGeneralAdapter()
        ui_menugenerallist.layoutManager = LinearLayoutManager(this)

    }

    fun openDecouverteButtonTouched(button: View){
        val intent = Intent(this, DecouverteActivity::class.java)
        startActivity(intent)
    }

    fun openSommaireButtonTouched(button: View){
        val intent = Intent(this, SommaireActivity::class.java)
        startActivity(intent)
    }


    }

merci par avance si vous avez des idées, de mon côté je vais continué à chercher

Hello Maxime, en regardant le code que j’ai rajouté ci-dessus, aurais tu une idée de ce qui manque, car mon recycler est toujours vide. si tu as une idée ça serait vraiment génial, car je suis perdu.

Je ne connais pas parse mais je suppose qu’à un moment donné tu es censé déclencher un chargement des données non ?
Par exemple je ne vois pas le code où tu crées la variable menuList
Tu es censé la passer en paramètre de ton adapter mais quand tu crées ton adapter dans MainActivity tu ne passes aucun paramètre. C’est normal ?

non ce n’est pas normal, c’est peut être le souci, une idée?

Comme je te disais je ne connais pas Parse, mais apparemment toi oui puisque tu as réussi à le faire marcher sur iOS.
Comment fais-tu pour lancer le chargement de ton objet de type List<PFmenuGeneral> ?
En plus, j’ai un doute sur le fait que le code que tu as mis ci-dessus compile car ta classe MenuGeneralAdapter attend un paramètre lors de la création d’objets : class MenuGeneralAdapter(private val menuList: List<PFmenuGeneral>) mais tu crées ton adapter sans fournir aucun paramètre :

ui_menugenerallist.adapter = MenuGeneralAdapter()

effectivemet ui_menugenerallist.adapter = MenuGeneralAdapter() n’a rien car pour le moment rien n’est envoyé, c’est pour cela qu’il ai vide. je vais revoir mon adapter. effectivemet sur mon appli ios ça fonctionne parfaitement . je suis pas sorti de la galère avec Kotlin :face_with_raised_eyebrow: :face_with_raised_eyebrow:

1 J'aime