Affichage pratique d'une liste vide

Parfois, l'utilisateur doit afficher une invite lorsque les données requises sont manquantes. Par exemple, une liste vide, une erreur de serveur ou aucune connexion Internet. Que faut-il faire dans le cas où l'indice devrait être complexe et différent pour chacun des cas? La mise en œuvre ci-dessous devrait résoudre ces problèmes.





L'essentiel est que l'obligation d'afficher les informations auxiliaires est affectée à un objet distinct. Cela donne une séparation plus correcte de la logique et moins de code dans l'activité. Passons à une description plus détaillée de l'implémentation.





Chaque indice est un fragment distinct qui peut contenir n'importe quoi. Pour les gérer, l'objet a besoin d'un FragmentManager et de l'ID du conteneur dans lequel les fragments doivent résider. Il n'y a plus de dépendances.





Chaque situation est un élément d'énumération (tout deviendra très clair avec le code) imbriqué dans cet objet. Lorsqu'un indice doit être modifié, la méthode responsable du remplacement sera appelée, à laquelle la nouvelle situation sera transmise. Tout cela est logique.





Maintenant, cela doit être fait dans les réalités d'Android. À l'exception de l'activité (ou du fragment) elle-même, qui a besoin d'un objet, personne d'autre n'y fera référence. Il existe un état initial "Par défaut". Il sera affiché la première fois qu'il apparaîtra, jusqu'à ce qu'une nouvelle valeur apparaisse. Les valeurs elles-mêmes sont stockées dans LiveData (qui se trouve dans le ViewModel), auquel l'activité souscrit et en transmet chaque nouvelle à l'objet. Cela vous permet de faire l'expérience de la recréation de l'activité et de maintenir l'état.





J'ai décidé d'utiliser les codes d'état HTTP comme exemple, mais n'importe lequel peut être utilisé. Par exemple, lors de l'interrogation d'une base de données de films avec des conditions sur la date de sortie, le réalisateur, les acteurs, etc. différents indices peuvent être montrés: il n'y a pas d'acteur requis, pas de film à cette date, ce réalisateur n'a pas de tels films, etc.





Nuances

Si, par exemple, vous n'effacez pas la liste des données, alors l'indice peut être affiché au-dessus (ou en dessous) de cette liste, ce qui sera moche. Pour ce faire, vous devez d'abord effacer la liste (ou masquer sa visibilité, ce qui est mieux?).





la mise en oeuvre





CodeSwitcher.

CodeSwitcher. Je ne pouvais pas penser à un nom adéquat.









//  
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 Mo) avec description

Dès le début, un état par défaut apparaît, il est spécialement affiché en arrière-plan, mais en réalité il devrait être vide. Ensuite, la réception de différents codes et leur affichage sont émulés. À la fin, on montre que l'état persiste même lorsque l'activité est recréée.









Que pensez-vous de cette méthode?





PS

Problème avec les noms ...












All Articles