You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Firebase Realtime获取数据时,如何控制ProgressBar的可见性?

问题分析与解决方案

你的代码未生效的核心原因有两个:

  1. Adapter类顶部声明的progressBar成员变量从未被赋值,始终为null,导致onDataChanged里的隐藏逻辑根本不会执行。
  2. ViewHolder里的progressBar是每个列表项内部的控件,和你要实现的「数据加载完成后隐藏全局加载进度条」需求不匹配。

修复步骤

1. 修改Adapter,接收全局ProgressBar参数

把页面(Activity/Fragment)中的全局ProgressBar传递给Adapter,替换原有未初始化的成员变量:

public class Ratings_Adapter extends FirebaseRecyclerAdapter<Ratings_model,Ratings_Adapter.myViewHolder> {

    private ProgressBar globalProgressBar; // 全局加载进度条

    // 修改构造方法,新增ProgressBar参数
    public Ratings_Adapter(@NonNull FirebaseRecyclerOptions<Ratings_model> options, ProgressBar progressBar) {
        super(options);
        this.globalProgressBar = progressBar;
    }

    // 保留原有onBindViewHolder、onCreateViewHolder、myViewHolder代码不变

    @Override
    public void onDataChanged(){
        super.onDataChanged(); // 必须调用父类方法,保证FirebaseUI核心逻辑正常执行
        if(globalProgressBar != null){
            globalProgressBar.setVisibility(View.GONE);
        }
    }
}

2. 在页面中初始化Adapter时传入ProgressBar

在你的Activity或Fragment里,找到全局的ProgressBar,初始化Adapter时传进去:

// 示例:Activity中的代码
ProgressBar progressBar = findViewById(R.id.your_global_progress_bar_id); // 替换成你实际的控件ID

// 构建FirebaseRecyclerOptions
FirebaseRecyclerOptions<Ratings_model> options = new FirebaseRecyclerOptions.Builder<Ratings_model>()
        .setQuery(yourFirebaseDatabaseQuery, Ratings_model.class) // 替换成你的Firebase查询逻辑
        .build();

// 初始化Adapter并传入ProgressBar
Ratings_Adapter adapter = new Ratings_Adapter(options, progressBar);
yourRecyclerView.setAdapter(adapter);
adapter.startListening();

补充说明

如果你的ProgressBar是每个列表项内部的加载进度控件(而非全局加载条),那应该在onBindViewHolder中结合Glide的加载监听来控制可见性,示例代码:

@Override
protected void onBindViewHolder(@NonNull myViewHolder holder, int position, @NonNull Ratings_model model) {
    holder.title.setText(model.getTitle());
    holder.description.setText(model.getDescription());

    // 显示item内的进度条
    holder.progressBar.setVisibility(View.VISIBLE);
    
    Glide.with(holder.img.getContext())
            .load(model.getImgurl())
            .placeholder(R.drawable.movie_icon)
            .error(R.drawable.cannot_load_item)
            .listener(new RequestListener<Drawable>() {
                @Override
                public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                    holder.progressBar.setVisibility(View.GONE);
                    return false;
                }

                @Override
                public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                    holder.progressBar.setVisibility(View.GONE);
                    return false;
                }
            })
            .into(holder.img);
}

内容的提问来源于stack exchange,提问作者Nithin reddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:50:26