0

I’m using Kotlin for my app.
I have a problem I can’t resolve.

I’m using a RecyclerView inside a fragment that show a Grid with 2 items per row.
Inside each item there are text and image loaded from Firebase.

Everything works perfectly. But, I don’t know why, randomly, the images disapear and return a white element. The text doesn’t changes, only the image changes.

There is two screens, just few seconds appart. In the first one everything is ok, it shows 4 éléments. Then I restart the app and 3 of the 4 images disapear (second screen). Only the last load to and from Firebase stays.

Inside the code, I’m using a data class named DataClassArticle, an adapter named ArticleAdapter and the fragment named Flux.


1 – First screen

2 – Second sceen

3 – Firebase

4 – Data Class

5 – Adapter

6 – Fragment


1 – FIRST SCREEN (EVERYTHING WORK) :
enter image description here


2- SECOND SCREEN (3 OF THE 4 IMAGES DISAPEAR) :
enter image description here


3 – FIREBASE (RETURNING : DESCRIPTION, PRIXVENTE, TITREVENTE, ZONE, PHOTO)
enter image description here


4- DATA CLASS

data class DataClassArticle(
    var titrevente: String? = null,
    var prixvente: String? = null,
    var zone: String? = null,
    var photo: String? = null
    )

5- ADAPTER

import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.example.givenaskv1.R
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener
import com.squareup.picasso.Picasso

class ArticleAdapter(private var articleList: ArrayList<DataClassArticle>) : RecyclerView.Adapter<ArticleAdapter.ViewHolder>() {
    val TAG = "TAG"
    var dataList = emptyList<DataClassArticle>()
    internal fun setDataList(dataList : List<DataClassArticle>) {
        this.dataList = dataList
        notifyDataSetChanged()
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        var articleImage : ImageView
        var articleTitle : TextView
        var articlePrice : TextView
        var articleLocalisation : TextView

        init {
            articleImage = itemView.findViewById(R.id.articleImage)
            articleTitle = itemView.findViewById(R.id.titreArticle)
            articlePrice = itemView.findViewById(R.id.prixArticle)
            articleLocalisation = itemView.findViewById(R.id.nomVilleArticle)
            
            val myId = FirebaseAuth.getInstance().uid
            com.example.givenaskv1.Map.dbref = FirebaseDatabase.getInstance().getReference("Vente")
            com.example.givenaskv1.Map.dbref.addValueEventListener(object : ValueEventListener {
                override fun onDataChange(snapshot: DataSnapshot) {
                    if (snapshot.exists()) {
                        for (missionSnapshot in snapshot.children) {
                            //    if (missionSnapshot.child("uid").value.toString() == myId) {
                            val test = missionSnapshot.child("uid").value.toString()
                            Log.d(TAG, "Ceci est l'UID : ${test}.")
                            //   }
                        }
                    }
                }
                override fun onCancelled(error: DatabaseError) {
                    TODO("Not yet implemented")
                }
            })
        }
    }

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

    override fun onBindViewHolder(holder: ArticleAdapter.ViewHolder, position: Int) {
        val data = articleList[position]

        holder.articleTitle.text = data.titrevente
        holder.articlePrice.text = data.prixvente
        holder.articleLocalisation.text = data.zone
        Picasso.get().load(data.photo).into(holder.articleImage)
    }
    override fun getItemCount() : Int {
       return articleList.size
    }
}

6- FRAGMENT

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.GenericTransitionOptions.with
import com.bumptech.glide.Glide.with
import com.bumptech.glide.load.resource.bitmap.BitmapTransitionOptions.with
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.with
import com.example.givenaskv1.R
import com.google.firebase.database.*
import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.fragment_flux.*
import kotlinx.android.synthetic.main.fragment_notification.*
import kotlinx.android.synthetic.main.post_vente.*

private const val TAG = "TAG"
class Flux : Fragment() {

    private var layoutManager: RecyclerView.LayoutManager? = null
    private var adapter: RecyclerView.Adapter<ArticleAdapter.ViewHolder>? = null
    private lateinit var dbref : DatabaseReference
    private lateinit var userRecyclerview : RecyclerView
    private lateinit var userArrayList : ArrayList<DataClassArticle>
    private lateinit var articleAdapter: ArticleAdapter


    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?

    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_flux, container, false)
    }

    override fun onViewCreated(itemView: View, savedInstanceState: Bundle?) {
        super.onViewCreated(itemView, savedInstanceState)
        // RvPosts = le recyclerview
        btnPublierVente.setOnClickListener {
            val bottomSheet = BottomsheetVentes()
            bottomSheet.show(fragmentManager!!, "BottomSheet")
        }

        rvPosts.apply {
            userRecyclerview = findViewById(R.id.rvPosts)
            userRecyclerview.setHasFixedSize(true)
            userArrayList = arrayListOf<DataClassArticle>()
            layoutManager = LinearLayoutManager(activity)
            rvPosts.setLayoutManager(GridLayoutManager(this.context, 2))
            getUserData()
        }
    }
    
    private fun getUserData() {
        
        dbref = FirebaseDatabase.getInstance().getReference("Vente")
        dbref.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                    for (userSnapshot in snapshot.children){
                        val user = userSnapshot.getValue(DataClassArticle::class.java)

                        userArrayList.add(user!!)
                        userRecyclerview.adapter = ArticleAdapter(userArrayList)
                    }
            }
            override fun onCancelled(error: DatabaseError) {
                TODO("Not yet implemented")
            }
        })
    }
}

Thank you guys for your help.
Have a good day !