0

I have created a Recyclerview that accepts data from firebase. While it is loading I want to show a progress bar in the recyclerview. All the blogs are suggesting Paginated Recyclerview or infinite scrollable reclyerview, but I want only one progress bar which loads only one time. Like This : WhatsApp Progressbar.

I used diffrent ways to do it. But nothing is working properly. This is my RecyclerView activity:

class RepeaterActivity : AppCompatActivity() , OnChapterClickedListener {

    lateinit var recyclerview: RecyclerView
    private var repeaterAdapter: repeater_adapter? = null
    private var firebaseRepo : Repeater_Firebase_Repo = Repeater_Firebase_Repo()
    private var item : ArrayList<Data_Source> = ArrayList()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_repeater)
        val repeatername = intent.getStringExtra("repeaterName")
        setSupportActionBar(findViewById(R.id.toolbar_repeater))

        supportActionBar?.apply {
            setDisplayHomeAsUpEnabled(true)
            setDisplayShowHomeEnabled(true)
            setTitle(repeatername)
        }


        recyclerview = findViewById(R.id.repeater_recycler) as RecyclerView
        initRecyclerView()
        loadData()

    }

    private fun initRecyclerView() {

        recyclerview.apply {
            layoutManager = LinearLayoutManager(this@RepeaterActivity)
            repeaterAdapter = repeater_adapter(item, this@RepeaterActivity)
            adapter = repeaterAdapter

        }


    }


    private fun loadData(){
        firebaseRepo.getchapter().addOnCompleteListener{
            if (it.isSuccessful){
                item = it.result!!.toObjects(Data_Source::class.java) as ArrayList<Data_Source>
                repeaterAdapter?.items  = item
                repeaterAdapter?.notifyDataSetChanged()

            }

            else{
                Log.d(TAG, "Error: ${it.exception!!.message}")
            }
        }
    }


    override fun OnClickItem(position: Int, items: ArrayList<Data_Source>) {
        val intent = Intent(this, RepeaterChapterActivity::class.java)
        intent.putExtra("itemname", items[position].name)
        intent.putExtra("itemdescription",items[position].description)
        intent.putExtra("itemimage",items[position].image)
        intent.putExtra("itemvideo",items[position].video)
        startActivity(intent)

    }


}

And this is my adapter class:

class repeater_adapter(
        var items: ArrayList<Data_Source>,
        private val clickListener: OnChapterClickedListener) :
    RecyclerView.Adapter<repeater_viewholder>() {


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): repeater_viewholder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item, parent, false)
        val viewholder = repeater_viewholder(view)
        return viewholder

    }

    override fun onBindViewHolder(holder: repeater_viewholder, position: Int) {

        holder.bind(items.get(position))


        holder.itemView.setOnClickListener{

            clickListener.OnClickItem(position, items)

        }
    }

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

}

class repeater_viewholder(itemview: View) : RecyclerView.ViewHolder(itemview){


    val titleview : TextView = itemview.findViewById(R.id.itemtext)
    val imageview = itemview.findViewById<ImageView>(R.id.itemimage)

    fun bind(dataSource: Data_Source){
        titleview.setText(dataSource.name)
        Glide.with(itemView.context).load(dataSource.image).into(imageview)

    }

}

1 Answers1

0

Add the progress bar in your activity/fragment layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    
    <ProgressBar
        android:layout_centerInParent="true"
        android:id="@+id/progress_bar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</RelativeLayout>

then when you have done fetching data hide the progress bar

private fun loadData(){
        firebaseRepo.getchapter().addOnCompleteListener{
            progressBar.setVisiblity(View.GONE)l
            if (it.isSuccessful){
                item = it.result!!.toObjects(Data_Source::class.java) as ArrayList<Data_Source>
                repeaterAdapter?.items  = item
                repeaterAdapter?.notifyDataSetChanged()

            }

            else{
                Log.d(TAG, "Error: ${it.exception!!.message}")
            }
        }
    }
Muhammad Ahmed
  • 1,038
  • 1
  • 7
  • 7
  • kindly share the stack trace – Muhammad Ahmed Feb 03 '21 at 07:16
  • E/AndroidRuntime: FATAL EXCEPTION: main Process: com.abphysics.abphysics, PID: 10784 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.abphysics.abphysics/com.abphysics.abphysics.Activity.RepeaterActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3346) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3594) – Abhimanyu Bhowmik Feb 03 '21 at 15:31
  • Add the Activity in your AndroidMenifest https://stackoverflow.com/questions/4688277/java-lang-runtimeexception-unable-to-instantiate-activity-componentinfo – Muhammad Ahmed Feb 03 '21 at 20:19