'Why my realtime databaase cannot be worked?

I have faced the problem that my firebase cannot be worked as well and it just shows me nothing ( white page ) in my application. I need to use firebase to show the material in the recycler view. However, as the new user for firebase, I set my recycler view in string form and after it, I also want to use as one is image one is text. But I think that I need to fix the first problem as well. Can somebody help me? Thank you for your help!!

My original code :

package com.example.assignment_mad

import android.content.ContentValues.TAG
import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2
import com.example.assignment_mad.databinding.ActivityMainBinding
import com.example.assignment_mad.databinding.FragmentNotificationBinding
import com.example.assignment_mad.databinding.FragmentSearchPageBinding
import com.google.android.material.imageview.ShapeableImageView
import com.google.android.material.tabs.TabLayout
import com.google.firebase.database.*
import com.google.firebase.database.ktx.database
import com.google.firebase.ktx.Firebase
import kotlinx.android.synthetic.*
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fragment_notification_.*


class Notification_Fragment : Fragment( ) {

    val database=Firebase.database
    val myRef=database.getReference("message")

    private var _binding:FragmentNotificationBinding?=null
    private val binding get()=_binding!!

    private lateinit var dbref: DatabaseReference

    private lateinit var newRecyclerView: RecyclerView
    private lateinit var newArrayList: ArrayList<Company>
    private lateinit var tempArrayList: ArrayList<Company>
    lateinit var imageId:Array<Int>
    lateinit var heading:Array<String>
    lateinit var news:Array<String>

    private var layoutManager: RecyclerView.LayoutManager? = null
    private var adapter: RecyclerView.Adapter<NotificationAdapter.MyViewHolder>? = null

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        var views =inflater.inflate(R.layout.fragment_notification_, container, false)
        newRecyclerView=views.findViewById(R.id.recyclerView)

        // Inflate the layout for this fragment
        return views



    }

    override fun onViewCreated(itemView: View, savedInstanceState: Bundle?) {

        super.onViewCreated(itemView, savedInstanceState)

        newArrayList= arrayListOf<Company>()
        tempArrayList= arrayListOf<Company>()
        getUserdata()

    }

    private fun getUserdata() {
        dbref=FirebaseDatabase.getInstance().getReference("Notification")
        dbref.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                if (snapshot.exists()){
                    for (companySnapshot in snapshot.children){
                        val company=companySnapshot.getValue(Company::class.java)
                        newArrayList.add(company!!)
                    }

                    newRecyclerView.adapter=NotificationAdapter(newArrayList)
                }
            }

            override fun onCancelled(error: DatabaseError) {
                Log.w(TAG, "Failed to read value.", error.toException())
            }

        })
        
        newRecyclerView.layoutManager=LinearLayoutManager(activity)
        newRecyclerView.setHasFixedSize(true)
        newRecyclerView.adapter=adapter
    }


}

The adapter code :

package com.example.assignment_mad

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.imageview.ShapeableImageView
import kotlinx.android.synthetic.main.dropdown_item.view.*


class NotificationAdapter(private val companysList:ArrayList<Company>):RecyclerView.Adapter<NotificationAdapter.MyViewHolder>() {



    private var mListener:onItemClickListener?=null

    interface onItemClickListener{
        fun onItemClick(position: Int)
    }

    fun setOnItemClickListener(listener: onItemClickListener){
        mListener=listener
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {

        val itemView=LayoutInflater.from(parent.context).inflate(R.layout.list_item,parent,false)
        return MyViewHolder(itemView,mListener)
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val currentItem=companysList[position]
        holder.titleImage.text=currentItem.titleImage
//        holder.titleImage.setImageResource(currentItem.titleImage)
        holder.tvHeading.text=currentItem.heading
    }

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

    //to insert the post detail


    class MyViewHolder(itemView: View,listener: onItemClickListener?):RecyclerView.ViewHolder(itemView){

        val titleImage:TextView=itemView.findViewById(R.id.title_image)
//        val titleImage:ShapeableImageView=itemView.findViewById(R.id.title_image)
        val tvHeading: TextView =itemView.findViewById(R.id.tvHeading)

        init {
            itemView.setOnClickListener{
                listener?.onItemClick(adapterPosition)
            }
        }
    }

}

Data :

package com.example.assignment_mad

data class Company(var titleImage:String?=null,var heading:String?=null)

//data class Company(var titleImage:Int,var heading:String)

The xml file ( as you see, actually i need image and text together ) :

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_margin="8dp">

<!--    <com.google.android.material.imageview.ShapeableImageView-->
<!--        android:layout_width="80dp"-->
<!--        android:layout_height="80dp"-->
<!--        android:id="@+id/title_image"-->
<!--        android:scaleType="centerCrop"-->
<!--        app:layout_constraintStart_toStartOf="parent"-->
<!--        app:layout_constraintTop_toTopOf="parent"-->
<!--        app:shapeAppearanceOverlay="@style/RoundCorner"-->
<!--        android:src="@drawable/company_logo_1"/>    -->

    <TextView
        android:id="@+id/title_image"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:textColor="@color/black"
        android:text="Self Brief"
        android:textSize="16dp"
        android:textStyle="bold"
        android:layout_marginStart="16dp"
        android:layout_marginEnd="32dp"
        android:layout_marginTop="8dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>


    <TextView
        android:id="@+id/tvHeading"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:textColor="@color/black"
        android:text="Candidate Biden Called Saudi Arable a Pareft eaft."
        android:textSize="16dp"
        android:textStyle="bold"
        android:layout_marginStart="16dp"
        android:layout_marginEnd="32dp"
        android:layout_marginTop="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/title_image"
        app:layout_constraintTop_toTopOf="parent"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_margin="8dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/title_image"
        android:background="@color/underline"/>


</androidx.constraintlayout.widget.ConstraintLayout>

These is the problem faced. Or some one else can directly teach me how to set image for realtime database?

My database pic :

enter image description here



Solution 1:[1]

Your RecyclerView is showing no item because you are never initializing the adapter variable, which you are setting to your RecyclerView's adapter. Initialize adapter variable inside onViewCreated()

override fun onViewCreated(itemView: View, savedInstanceState: Bundle?) {
    super.onViewCreated(itemView, savedInstanceState)
    newArrayList= arrayListOf<Company>()
    tempArrayList= arrayListOf<Company>()

    adapter = NotificationAdapter(newArrayList) //Initialize adapter

    getUserdata()
}

Inside onDataChange(), after adding data to newArrayList, notify adapter by calling notifyDataSetChanged() on adapter. It would update the RecyclerView.

private fun getUserdata() {
        dbref=FirebaseDatabase.getInstance().getReference("Notification")
        dbref.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                if (snapshot.exists()){
                    for (companySnapshot in snapshot.children){
                        val company=companySnapshot.getValue(Company::class.java)
                        newArrayList.add(company!!)
                    }
                    adapter.notifyDataSetChanged()
                }
            }

            override fun onCancelled(error: DatabaseError) {
                Log.w(TAG, "Failed to read value.", error.toException())
            }

        })
        
        newRecyclerView.layoutManager=LinearLayoutManager(activity)
        newRecyclerView.setHasFixedSize(true)
        newRecyclerView.adapter = adapter
    }

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Praveen