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

RecyclerView中ProgressBar设置VISIBLE后不显示的问题求助

解决RecyclerView中AsyncTask进度条不显示的问题

嘿,我碰到过好几个类似的情况,咱们一步步排查下为啥你的ProgressBar没出现哈!

1. 先检查AsyncTask的执行模式

从Android 3.0开始,AsyncTask默认是串行执行的——所有任务会排队在主线程的任务队列里。如果之前有其他耗时的AsyncTask在跑,你的任务可能被堵在后面,导致onPreExecute里的可见性设置迟迟没机会生效。

解决办法:改用并行执行,把execute()换成:

yourTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, yourParams);

2. 警惕RecyclerView的Item复用坑

如果ProgressBar是在RecyclerView的Item布局里,最大的可能是ViewHolder复用导致的引用失效:

  • 你可能在AsyncTask里引用了旧的ViewHolder对象,等任务执行到onPreExecute时,那个ViewHolder已经被复用给其他Item了,设置的不是当前你要显示的那个ProgressBar。
  • 或者在任务执行过程中,Item被滑出屏幕,ViewHolder被回收,后续的onPostExecute操作的是已经不在屏幕上的View。

修复方案:用弱引用持有ProgressBar,避免内存泄漏同时确保操作的是当前有效的View:

private class MyTask extends AsyncTask<Void, Void, YourResult> {
    private WeakReference<ProgressBar> progressBarRef;

    public MyTask(ProgressBar bar) {
        progressBarRef = new WeakReference<>(bar);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        ProgressBar bar = progressBarRef.get();
        if (bar != null) {
            bar.setVisibility(View.VISIBLE);
        }
    }

    @Override
    protected YourResult doInBackground(Void... voids) {
        // 你的后台任务逻辑
        return result;
    }

    @Override
    protected void onPostExecute(YourResult result) {
        super.onPostExecute(result);
        ProgressBar bar = progressBarRef.get();
        if (bar != null) {
            bar.setVisibility(View.GONE);
        }
        // 在这里更新Item的结果UI
    }
}

在Adapter的onBindViewHolder里启动任务时,传入当前ViewHolder的ProgressBar:

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    // 初始隐藏进度条
    holder.progressBar.setVisibility(View.GONE);
    // 启动异步任务
    new MyTask(holder.progressBar).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}

3. 排查ProgressBar的布局问题

有时候不是代码逻辑的问题,而是布局本身的坑:

  • 检查ProgressBar是不是被其他View完全覆盖了(比如Item里的TextView占满了整个空间)。
  • 确认ProgressBar的宽高设置合理,比如不要设成wrap_content但没有默认尺寸(可以改成match_parent或者固定dp值)。
  • 临时给ProgressBar加个红色背景,看看是不是设成VISIBLE但因为颜色和背景一样看不见。

4. 确认UI操作的正确性

虽然onPreExecute和onPostExecute本身是在主线程执行,但要确保:

  • 没有其他代码在之后又把ProgressBar设为GONE(比如Adapter的其他逻辑或者数据更新时的重置)。
  • 不要在doInBackground里操作UI——虽然AsyncTask的这两个方法是安全的,但如果不小心在后台线程动了UI,会导致异常或者状态混乱。

最后提醒:记得在Activity/Fragment销毁时取消正在执行的AsyncTask,避免内存泄漏:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (yourTask != null && yourTask.getStatus() != AsyncTask.Status.FINISHED) {
        yourTask.cancel(true);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:17:50