如何在加载 recyclerview 之前显示进度条?

时间:2021-02-02 20:27:00

标签: android android-recyclerview loading android-adapter android-progressbar

我创建了一个 Recyclerview,它接受来自 firebase 的数据。在加载时,我想在 recyclerview 中显示一个进度条。所有的博客都建议分页 Recyclerview 或无限滚动 reclyerview,但我只想要一个只加载一次的进度条。像这样:WhatsApp Progressbar

我使用了不同的方法来做到这一点。但没有任何工作正常。这是我的 RecyclerView 活动:

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)

    }


}

这是我的适配器类:

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 个答案:

答案 0 :(得分:0)

在您的活动/片段布局中添加进度条

<?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>

然后当你完成获取数据时隐藏进度条

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}")
            }
        }
    }