Home > Back-end >  The RecyclerView doesn't retrieve any data from Firebase and doesn't show any data
The RecyclerView doesn't retrieve any data from Firebase and doesn't show any data

Time:07-07

I just started working with Android Studio, and I've been trying to figure out what's wrong with this code for a few days now. When I run the program it shows nothing, and also there is no errors from Android Studio. I read the posts on the subject, but unfortunately I found nothing appropriate.

This is my activity class.

package ie.wit.donationx.activities

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.firebase.database.*
import ie.wit.donationx.adapters.EventsAdapter
import ie.wit.donationx.databinding.ActivityEventsFeedBinding
import ie.wit.donationx.models.EventData

class EventsFeed : AppCompatActivity() {
    lateinit var mDataBase: DatabaseReference
    private lateinit var eventList:ArrayList<EventData>
    private lateinit var mAdapter: EventsAdapter
    private lateinit var binding: ActivityEventsFeedBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //setContentView(R.layout.activity_events_feed)
        binding = ActivityEventsFeedBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)

        eventList = ArrayList()
        mAdapter = EventsAdapter(this,eventList)
        var linearLayoutManager = LinearLayoutManager(this)
        binding.recyclerEvents.layoutManager = linearLayoutManager
        binding.recyclerEvents.setHasFixedSize(true)
        binding.recyclerEvents.adapter = mAdapter
        getEventsData()

    }

    private fun getEventsData() {

        mDataBase = FirebaseDatabase.getInstance().getReference("Events")
        mDataBase.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                if (snapshot.exists()) {
                    for (eventSnapshot in snapshot.children) {
                        val event = eventSnapshot.getValue(EventData::class.java)
                        eventList.add(event!!)
                    }
                    binding.recyclerEvents.adapter = mAdapter
                }
            }

            override fun onCancelled(error: DatabaseError) {
                TODO("Not yet implemented")
            }
        })
    }

}

This is my Adapter

package ie.wit.donationx.adapters

import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.RecyclerView
import ie.wit.donationx.R
import ie.wit.donationx.databinding.ItemListBinding
import ie.wit.donationx.models.EventData

class EventsAdapter(
    var c: Context, var eventList: ArrayList<EventData>)
    : RecyclerView.Adapter<EventsAdapter.EventViewHolder>() {

    inner class EventViewHolder(var v: ItemListBinding): RecyclerView.ViewHolder(v.root){}

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): EventViewHolder {
        val infilter = LayoutInflater.from(parent.context)
        val v = DataBindingUtil.inflate<ItemListBinding>(
            infilter,R.layout.item_list,parent,
            false
        )
        return EventViewHolder(v)
    }

    override fun onBindViewHolder(holder: EventViewHolder, position: Int) {
        val newList = eventList[position]
        holder.v.isEvent = eventList[position]
        holder.adapterPosition
    }

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


}

XML recyclerView

 <?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="match_parent"
    tools:context=".activities.EventsFeed">

   <com.google.android.material.imageview.ShapeableImageView
        android:id="@ id/main_shapeable"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_marginStart="10dp"
        android:layout_marginTop="5dp"
        android:layout_marginEnd="10dp"
        android:background="@color/white"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@ id/main_search"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginEnd="20dp"
        android:ems="10"
        android:hint="search"
        android:inputType="textPersonName"
        android:textSize="14sp"
        app:layout_constraintBottom_toBottomOf="@ id/main_shapeable"
        app:layout_constraintEnd_toEndOf="@ id/main_shapeable"
        app:layout_constraintStart_toStartOf="@ id/main_shapeable"
        app:layout_constraintTop_toTopOf="@ id/main_shapeable" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@ id/recyclerEvents"
        tools:listitem="@layout/item_list"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="10dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@ id/main_shapeable"/>
</androidx.constraintlayout.widget.ConstraintLayout>

XML file for items in recyclerView

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <variable
            name="isEvent"
            type="ie.wit.donationx.models.EventData" />


    </data>

    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:cardCornerRadius="5dp"
        >
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <LinearLayout
                android:orientation="horizontal"
                android:layout_margin="10dp"
                android:padding="8dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <ImageView
                    android:id="@ id/eventImg"
                    android:imageUrl="@{isEvent.image}"
                    android:scaleType="centerCrop"
                    android:layout_width="140dp"
                    android:layout_height="140dp"/>
                <LinearLayout
                    android:orientation="vertical"
                    android:gravity="center"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">
                    <TextView
                        android:id="@ id/eventTitle"
                        android:textColor="@color/black"
                        android:textSize="20sp"
                        android:gravity="center"
                        android:textStyle="bold|normal"
                        android:layout_gravity="center"
                        android:text="@{isEvent.evenTitle}"
                        android:layout_margin="10dp"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"/>

                    <TextView
                        android:id="@ id/eventInfo"
                        android:textColor="@android:color/darker_gray"
                        android:textSize="15sp"
                        android:gravity="center"
                        android:textStyle="bold|normal"
                        android:layout_gravity="center"
                        android:text="@{isEvent.info}"
                        android:layout_margin="10dp"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"/>




                </LinearLayout>
            </LinearLayout>
            <View
                android:background="@android:color/darker_gray"
                android:layout_width="match_parent"
                android:layout_height="1dp"/>



        </LinearLayout>

    </androidx.cardview.widget.CardView>
</layout>

Data file

package ie.wit.donationx.models

class EventData {
    var evenTitle: String? = null
    var info: String? = null
    var image: String? = null

    constructor(){}

    constructor(
        evenTitle:String?,
        info:String?,
        image:String?
    ){
        this.evenTitle = evenTitle
        this.info = info
        this.image = image
    }
}

Firebase DB structure

CodePudding user response:

When adding new list to the RecyclerView Adapter you need to call NotifyDataSetChanged()

Also, i advise to remove the list from the constructor of the adapter, and make a public function inside the adapter class that will update the private list created in the class.

private var items: MutableList<EventData> = mutableListOf()

fun setItems(newItemsList : List<EventData>){
eventList.clear()
eventList.addAll(newItemsList)
notifyDataSetChanged()
}

If you only update part of the list, you can create a separate function for that and use the more efficient notifyItemRangeInserted(), notifyItemInserted() or notifyItemChanged() \ notifyItemRangeChanged

CodePudding user response:

You don't need to setAdaper again after getting EventsData

Just replace this line in getEventsData() :

binding.recyclerEvents.adapter = mAdapter

With :

  if (eventList.size > 0) {
       mAdapter.notifyDataSetChanged()
      }
  • Related