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

WiFi网络切换时RecyclerView数据丢失问题求助

问题分析与解决方案

核心问题

切换网络后RecyclerView数据消失、重启应用恢复,本质是网络切换后的数据源更新流程未正确触发Adapter刷新,或是数据源更新后没有通知Adapter重新渲染。从你提供的MesaAdapter代码来看,当前实现存在关键缺陷:

  1. 数据源mesas直接赋值,没有提供安全更新数据源并通知UI的方法
  2. 网络切换后重新拉取数据时,大概率仅获取了数据,但未更新Adapter的mesas列表,也未调用刷新通知方法

针对MesaAdapter的修复

给Adapter添加数据源更新方法,确保数据变化时能同步刷新UI:

public class MesaAdapter extends Adapter<MesaViewHolder> implements OnClickListener, OnLongClickListener {
    //region Variáveis
    private int posicaoSelecionada = -1;
    private WeakReference<Activity> activityWeakReference;
    private WeakReference<OnSelectedMesaListener> listenerWeakReference;
    private List<Mesa> mesas;
    //endregion

    //region Construtor
    public MesaAdapter(List<Mesa> mesas, Activity activity, OnSelectedMesaListener listener) {
        this.mesas = new ArrayList<>(mesas); // 创建列表副本,避免外部修改导致的不可控问题
        this.activityWeakReference = new WeakReference<>(activity);
        this.listenerWeakReference = new WeakReference<>(listener);
    }
    //endregion

    // 添加数据源更新方法
    public void updateMesas(List<Mesa> newMesas) {
        this.mesas.clear();
        this.mesas.addAll(newMesas);
        notifyDataSetChanged(); // 通知Adapter刷新UI
    }

    //region Adapter
    @NonNull
    @Override
    public MesaViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        View itemView = LayoutInflater.from(context).inflate(R.layout.item_mesa, parent, false);
        itemView.setOnClickListener(this);
        itemView.setOnLongClickListener(this);
        Activity activity = activityWeakReference.get();
        if (activity != null) {
            activity.registerForContextMenu(itemView);
        }
        return new MesaViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull MesaViewHolder holder, int position) {
        holder.itemView.setTag(position);
        Mesa mesa = mesas.get(position);
        holder.configurarMesa(mesa);
    }

    // 必须实现的getItemCount方法(你提供的代码未包含)
    @Override
    public int getItemCount() {
        return mesas != null ? mesas.size() : 0;
    }

    // 原有onClick、onLongClickListener实现...
}

网络切换后的处理逻辑

在网络状态监听(比如ConnectivityManager的网络回调)或重新获取数据的代码中,执行以下步骤:

  1. 在子线程中重新从SQL Server拉取最新的Mesa列表数据
  2. 切换回主线程,调用Adapter的updateMesas(newMesas)方法更新数据源
  3. 避免直接修改外部传入的列表,确保所有数据源更新都通过Adapter的方法完成

其他排查点

  1. 打印日志确认网络切换后的请求是否成功获取到非空数据
  2. 检查是否存在网络切换时请求被拦截、未触发重新请求的情况(比如错误的缓存逻辑)
  3. 确认持有Adapter的页面(Activity/Fragment)在网络切换时处于正常生命周期状态,避免刷新通知失效

内容的提问来源于stack exchange,提问作者anthony josé

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:35:31