WiFi网络切换时RecyclerView数据丢失问题求助
问题分析与解决方案
核心问题
切换网络后RecyclerView数据消失、重启应用恢复,本质是网络切换后的数据源更新流程未正确触发Adapter刷新,或是数据源更新后没有通知Adapter重新渲染。从你提供的MesaAdapter代码来看,当前实现存在关键缺陷:
- 数据源
mesas直接赋值,没有提供安全更新数据源并通知UI的方法 - 网络切换后重新拉取数据时,大概率仅获取了数据,但未更新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的网络回调)或重新获取数据的代码中,执行以下步骤:
- 在子线程中重新从SQL Server拉取最新的
Mesa列表数据 - 切换回主线程,调用Adapter的
updateMesas(newMesas)方法更新数据源 - 避免直接修改外部传入的列表,确保所有数据源更新都通过Adapter的方法完成
其他排查点
- 打印日志确认网络切换后的请求是否成功获取到非空数据
- 检查是否存在网络切换时请求被拦截、未触发重新请求的情况(比如错误的缓存逻辑)
- 确认持有Adapter的页面(Activity/Fragment)在网络切换时处于正常生命周期状态,避免刷新通知失效
内容的提问来源于stack exchange,提问作者anthony josé
相关产品推荐
相关产品推荐

