Cómoda visualización de una lista vacía

A veces, el usuario necesita mostrar un mensaje cuando faltan los datos requeridos. Por ejemplo, una lista vacía, un error del servidor o sin conexión a Internet. ¿Qué se debe hacer en el caso de que la sugerencia sea compleja y diferente para cada uno de los casos? La implementación a continuación debería abordar estos problemas.





La conclusión es que el deber de mostrar información auxiliar se asigna a un objeto separado. Esto proporciona una separación más correcta de la lógica y menos código en la actividad. Procedamos a una descripción más detallada de la implementación.





Cada pista es un fragmento separado que puede contener cualquier cosa. Para administrarlos, el objeto necesita un FragmentManager y el Id del contenedor en el que deben residir los fragmentos. No hay más dependencias.





Cada situación es un elemento de enumeración (todo quedará muy claro con el código) anidado en este objeto. Cuando sea necesario cambiar una pista, se llamará al método responsable del reemplazo, al que se pasará la nueva situación. Todo esto es lógica.





Ahora bien, esto debe hacerse en la realidad de Android. A excepción de la actividad (o fragmento) en sí, que necesita un objeto, nadie más se referirá a él. Hay un estado inicial "Predeterminado". Se mostrará la primera vez que aparezca, hasta que aparezca un nuevo valor. Los valores en sí se almacenan en LiveData (que está en ViewModel), al que la actividad se suscribe y pasa cada uno nuevo al objeto. Esto le permite experimentar la recreación de la actividad y mantener el estado.





Decidí usar los códigos de estado HTTP como ejemplo, pero se puede usar cualquiera. Por ejemplo, al consultar una base de datos de películas con condiciones sobre fecha de estreno, director, actores, etc. Se pueden mostrar diferentes pistas: no hay actor requerido, no hay película en esta fecha, este director no tiene tales películas, etc.





Matices

Si, por ejemplo, no borra la lista de datos, es posible que la sugerencia se muestre arriba (o debajo) de esta lista, lo que será feo. Para hacer esto, primero debe borrar la lista (u ocultar su visibilidad, ¿cuál es mejor?).





Implementación





CodeSwitcher.

CodeSwitcher. No pude pensar en un nombre adecuado.









//  
public class CodeSwitcher {
    //  
    public enum Code {
        DEFAULT,

        HTTP_OK,
        HTTP_CREATED,
        HTTP_BAD_REQUEST,
        HTTP_NOT_FOUND,

        NO_DATA
    }

    //
    private FragmentManager fragmentManager;
    private int fragmentHostId;

    public CodeSwitcher(FragmentManager fragmentManager, int fragmentHostId) {
        this.fragmentManager = fragmentManager;
        this.fragmentHostId = fragmentHostId;
    }

    //,    
    public void switchFragments(Code code) {
        FragmentTransaction transaction = fragmentManager.beginTransaction();

        switch (code) {
            case HTTP_OK:
                transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_OK"));
                break;

            case HTTP_CREATED:
                transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_CREATED"));
                break;

            case HTTP_BAD_REQUEST:
                transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_BAD_REQUEST"));
                break;

            case HTTP_NOT_FOUND:
                transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_NOT_FOUND"));
                break;

            case NO_DATA:
                transaction.replace(fragmentHostId, CodeFragment.newInstance("NO_DATA"));
                break;

            default:
                transaction.replace(fragmentHostId, CodeFragment.newInstance("Default"));
                break;
        }

        transaction.commit();
    }
}
      
      



// ViewModel

//     
public CodeShowActivityViewModel() {
    listCode = new MutableLiveData<>();
    listCode.setValue(CodeSwitcher.Code.DEFAULT);
}

//   ,    ,    
public void httpOk() {
  listCode.setValue(CodeSwitcher.Code.HTTP_OK);
  clearList();
}

public void httpBadRequest() {
  listCode.setValue(CodeSwitcher.Code.HTTP_BAD_REQUEST);
  clearList();
}
      
      



// ,   
private CodeSwitcher switcher;

// onCreate()
switcher = new CodeSwitcher(getSupportFragmentManager(), R.id._);

//  LiveData,    
codeActVM.getListCode().observe(this, code -> {
  switcher.switchFragments(code);
});
      
      



GIF (4 MB) con descripción

Desde el principio, aparece un estado predeterminado, se muestra especialmente en segundo plano, pero en realidad debería estar vacío. Luego se emula la recepción de varios códigos y su visualización. Al final, se muestra que el estado persiste incluso cuando se recrea la actividad.









¿Qué opinas de este método?





PD

Problemas con los nombres ...












All Articles