[Разработка мобильных приложений, Разработка под Android] Удобное отображение пустого списка
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Иногда пользователю необходимо показать подсказу при отсутствии необходимых данных. Например, пустой список, ошибка сервера или отсутствие соединения с сетью интернет. Как быть в случае, когда подсказка должна быть сложной и отличаться для каждого из случаев? Реализация, представленная ниже, должна решить эти проблемы.Суть заключается в том, что обязанность показа вспомогательной информации возлагается на отдельный объект. Это дает более правильное разделение логики и уменьшение кода в активности. Приступим к более подробному описанию реализации.Каждая подсказа представляет из себя отдельный фрагмент, который может содержать все угодно. Чтобы управлять ими, объекту нужен FragmentManager и Id контейнера, в котором должны находится фрагменты. Больше зависимостей нет. Каждая ситуация представляет из себя элемент перечисления (все станет очень понятно с кодом), вложенного в этот объект. Когда нужно изменить подсказку, будет вызываться метод, отвечающий за замену, в который будет передаваться новая ситуация. Это вся логика.Теперь это надо сделать в реалиях Андроида. Кроме самой активности (или фрагмента), которой нужен объект, на него никто больше ссылаться не будет. Есть начальное, «Дефолтное», состояние. Оно будет отображаться при первом появлении, пока не появится новое значение. Сами значения хранятся в LiveData (которая во ViewModel), на которую подписывается активность и передает каждое новое объекту. Это позволяет переживать пересоздание активности и сохранять состояние. Я в качестве примера решил использовать коды состояния HTTP, но могут быть использованы любые. Например, при запросе к бд фильмов с условиями о дате выхода, режиссере, актерах и т.п. могут быть показаны разные подсказки: нет нужного актера, нет фильма в этой дате, у этого режиссера нет таких фильмов и т.д.Нюансы Если, например, не очистить список от данных, то подсказка может быть отображена поверх (или под) этим списком, что будет некрасиво. Для этого нужно предварительно очищать список (или скрывать его видимость, что лучше?).РеализацияCodeSwitcher. CodeSwitcher. Я не смог придумать адекватного названия.
//код самого объекта
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);
});
Гифка (4мб) с описаниемС самого начала появляется дефолтное состояние, оно специально отображается на фоне, но в реальности должно быть пустым. Затем эмулируется получение различных кодов и их отображение. В конце показано, что состояние сохраняется и при пересоздании активности.
Что думаете об этом способе? P.S.Беды с названиями...
===========
Источник:
habr.com
===========
Похожие новости:
- [Информационная безопасность, Криптография, Разработка под Android, Софт] Google по ошибке удалила мессенджер Element из каталога Google Play, затем вернула обратно
- [Разработка мобильных приложений, Софт, Социальные сети и сообщества, Финансы в IT] Шорт-сквиз в мировом масштабе. Robinhood ввёл ограничения на покупку более 50 акций
- [IPTV, Разработка под Android, Машинное обучение, Производство и разработка электроники, Искусственный интеллект] Promwad начал внедрять на ТВ-приставках приложение для поиска объектов из видеопотока
- [Разработка под iOS, Разработка мобильных приложений] Онбординг нового разработчика с помощью Ansible
- [Разработка мобильных приложений, Софт, Социальные сети и сообщества, Финансы в IT] Мобильное приложение Robinhood запретило покупать акции AMC, Blackberry, Nokia и GameStop
- [Разработка мобильных приложений, Законодательство в IT] Большинство российских государственных мобильных приложений используют иностранные трекеры
- [Разработка мобильных приложений, Разработка под Android, Дизайн мобильных приложений, Аналитика мобильных приложений] Приложение отвечает: как мы уменьшили количество ANRs в шесть раз. Часть 2, про исправление ошибок (перевод)
- [.NET, Разработка мобильных приложений, Сетевые технологии, C#, История IT] Менеджер приложений для Windows Mobile
- [Java, Разработка мобильных приложений, Разработка под Android] Android Bluetooth Low Energy (BLE) – готовим правильно, часть #4 (bonding) (перевод)
- [Разработка мобильных приложений, Разработка под Android] Ликбез по Navigation Component: тем, кто пропустил все туториалы
Теги для поиска: #_razrabotka_mobilnyh_prilozhenij (Разработка мобильных приложений), #_razrabotka_pod_android (Разработка под Android), #_android (андроид), #_pustoj_spisok (пустой список), #_pustoj_ekran (пустой экран), #_razrabotka_mobilnyh_prilozhenij (
Разработка мобильных приложений
), #_razrabotka_pod_android (
Разработка под Android
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 14:38
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Иногда пользователю необходимо показать подсказу при отсутствии необходимых данных. Например, пустой список, ошибка сервера или отсутствие соединения с сетью интернет. Как быть в случае, когда подсказка должна быть сложной и отличаться для каждого из случаев? Реализация, представленная ниже, должна решить эти проблемы.Суть заключается в том, что обязанность показа вспомогательной информации возлагается на отдельный объект. Это дает более правильное разделение логики и уменьшение кода в активности. Приступим к более подробному описанию реализации.Каждая подсказа представляет из себя отдельный фрагмент, который может содержать все угодно. Чтобы управлять ими, объекту нужен FragmentManager и Id контейнера, в котором должны находится фрагменты. Больше зависимостей нет. Каждая ситуация представляет из себя элемент перечисления (все станет очень понятно с кодом), вложенного в этот объект. Когда нужно изменить подсказку, будет вызываться метод, отвечающий за замену, в который будет передаваться новая ситуация. Это вся логика.Теперь это надо сделать в реалиях Андроида. Кроме самой активности (или фрагмента), которой нужен объект, на него никто больше ссылаться не будет. Есть начальное, «Дефолтное», состояние. Оно будет отображаться при первом появлении, пока не появится новое значение. Сами значения хранятся в LiveData (которая во ViewModel), на которую подписывается активность и передает каждое новое объекту. Это позволяет переживать пересоздание активности и сохранять состояние. Я в качестве примера решил использовать коды состояния HTTP, но могут быть использованы любые. Например, при запросе к бд фильмов с условиями о дате выхода, режиссере, актерах и т.п. могут быть показаны разные подсказки: нет нужного актера, нет фильма в этой дате, у этого режиссера нет таких фильмов и т.д.Нюансы Если, например, не очистить список от данных, то подсказка может быть отображена поверх (или под) этим списком, что будет некрасиво. Для этого нужно предварительно очищать список (или скрывать его видимость, что лучше?).РеализацияCodeSwitcher. CodeSwitcher. Я не смог придумать адекватного названия. //код самого объекта
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); }); Что думаете об этом способе? P.S.Беды с названиями... =========== Источник: habr.com =========== Похожие новости:
Разработка мобильных приложений ), #_razrabotka_pod_android ( Разработка под Android ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 14:38
Часовой пояс: UTC + 5