从Firebase Realtime获取数据时,如何控制ProgressBar的可见性?
问题分析与解决方案
你的代码未生效的核心原因有两个:
- Adapter类顶部声明的
progressBar成员变量从未被赋值,始终为null,导致onDataChanged里的隐藏逻辑根本不会执行。 - 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
相关产品推荐
相关产品推荐

