Search code examples
javaandroidnetwork-programmingwifi

RecyclerView lost data if wifi network change


When the device change network the list data retrieved fro sql server disappears, if I close application and login again the data appear.

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 = mesas;
        this.activityWeakReference = new WeakReference<>(activity);
        this.listenerWeakReference = new WeakReference<>(listener);
    }
    //endregion

    //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);
    }

Solution

  • Handle network state changes When the network state changes, such as when the Wi-Fi network changes, your app should react accordingly. If the network is available, you can continue fetching data or updating the RecyclerView. If the network is unavailable, you can display cached data or show a message indicating that the app is offline.

    • You can try like this

      // Register the network change receiver
       private void registerNetworkChangeReceiver(Activity activity) {
           networkChangeReceiver = new NetworkChangeReceiver();
           activity.registerReceiver(networkChangeReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
       }
      
       // Unregister the network change receiver
       private void unregisterNetworkChangeReceiver(Activity activity) {
           if (networkChangeReceiver != null) {
               try {
                   activity.unregisterReceiver(networkChangeReceiver);
               } catch (IllegalArgumentException e) {
                   Log.e("MesaAdapter", "Exception while unregistering NetworkChangeReceiver: " + e.getMessage());
               }
           }
       }
      
       // Network state change receiver
       private class NetworkChangeReceiver extends BroadcastReceiver {
           @Override
           public void onReceive(Context context, Intent intent) {
               if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
                   ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                   NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
                   boolean isNetworkConnected = activeNetworkInfo != null && activeNetworkInfo.isConnected();
      
                   if (isNetworkConnected && !isNetworkAvailable) {
                       // Network connection is restored
                       isNetworkAvailable = true;
                       // Handle data refresh or retrieval here
                       // ...
                   } else if (!isNetworkConnected && isNetworkAvailable) {
                       // Network connection is lost
                       isNetworkAvailable = false;
                       // Display offline data or show a message indicating no network
                       // ...
                   }
               }
           }
       }
      
       // Clean up resources
       public void onDestroy(Activity activity) {
           unregisterNetworkChangeReceiver(activity);
       }
       }
      

    I just hope it's work for you