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

Android中如何从其他Activity更新RecyclerView Adapter内ViewHolder的进度条

问题根因
  • 回调实例未绑定:你在UpdateActivity中声明的MyCallBack变量没有和Adapter里的对应ViewHolder实例关联,属于空对象。你当前注释了回调调用,直接写的progressBar.setProgress,该变量在UpdateActivity中不存在,所以没有生效。
  • 不能直接跨页面操作View:RecyclerView的ViewHolder属于持有该RecyclerView的页面/组件,UpdateActivity无法直接拿到另一个页面的View实例,直接调用操作肯定无效。
  • 未遵循RecyclerView更新逻辑:RecyclerView的所有UI变更都应该先修改对应位置的数据源,再通知Adapter刷新对应条目,直接操作ViewHolder的View会在列表滚动复用的时候出现进度错乱。
可行实现方案

步骤1:改造Adapter,新增进度存储字段和更新方法

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    // 存储每个条目的进度,和你的数据源一一对应
    private List<Integer> progressList = new ArrayList<>();
    // 对外暴露更新指定位置进度的方法
    public void updateItemProgress(int position, int progress) {
        if (position >=0 && position < progressList.size()) {
            progressList.set(position, progress);
            // 只刷新对应位置,避免全局刷新开销
            notifyItemChanged(position);
        }
    }
    // 初始化的时候给progressList填初始值,比如默认都是0
    public MyAdapter(List<Integer> progressList) {
        this.progressList = progressList;
    }

    public static class MyViewHolder extends RecyclerView.ViewHolder {
        ProgressBar progressBar;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            progressBar = itemView.findViewById(R.id.progress_bar);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        // 绑定的时候直接从进度列表拿值设置
        holder.progressBar.setProgress(progressList.get(position));
    }

    @Override
    public int getItemCount() {
        return progressList.size();
    }
}

步骤2:实现跨页面进度通知

这里提供不需要引入三方库的静态回调实现方案:

  1. 给Adapter新增静态更新回调接口
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    public interface OnProgressUpdateListener {
        void onUpdate(int position, int progress);
    }
    public static OnProgressUpdateListener updateListener;

    // 上述步骤1的其他代码保持不变
}
  1. 在持有RecyclerView的列表页面初始化回调
// 列表页初始化Adapter时赋值
myAdapter = new MyAdapter(initProgressList());
recyclerView.setAdapter(myAdapter);
MyAdapter.updateListener = new MyAdapter.OnProgressUpdateListener() {
    @Override
    public void onUpdate(int position, int progress) {
        // 切主线程更新UI
        runOnUiThread(() -> myAdapter.updateItemProgress(position, progress));
    }
};

// 列表页销毁时置空回调,避免内存泄漏
@Override
protected void onDestroy() {
    super.onDestroy();
    MyAdapter.updateListener = null;
}
  1. 在UpdateActivity的onPause中触发更新
@Override
protected void onPause() {
    super.onPause();
    final_value = position.getValue(); 
    // targetPosition是你要更新的列表对应条目的索引,需要提前传递到当前Activity
    if (MyAdapter.updateListener != null) {
        MyAdapter.updateListener.onUpdate(targetPosition, final_value);
    }
}
注意事项
  • 要确保传递的targetPosition是列表中对应条目的正确索引,不然会更新错条目
  • 所有UI更新操作都要在主线程执行
  • 静态回调使用后要及时置空,避免内存泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:21:01