Процесс

Как было сказано в предыдущей статье, мое приложение будет иметь три вкладки, каждая из которых будет иметь аналогичные утилиты, поэтому я решил попробовать реализовать только вкладку задач до того, как будут реализованы все три вкладки, чтобы проверить, сработает ли моя идея для этого приложения. .

Для вкладки я реализовал RecyclerView — эффективный прокручиваемый список. Каждая задача будет иметь форму CardView (макет на основе карт), который человек может щелкнуть, и это приведет к новому действию, в котором пользователь может редактировать детали и обновлять задачу, приоритет и расчетное время. У меня также была плавающая кнопка действия, которую пользователь нажимал, чтобы создать новую задачу. Эта реализация может показаться простой на бумаге, но как новичок я столкнулся со многими препятствиями, которых, надеюсь, с помощью этой статьи вы сможете избежать.

Одним из препятствий, с которым я столкнулся, было понимание того, как работает RecyclerView. Для RecyclerView необходимы класс-адаптер и класс-держатель, в которых написана реализация RecyclerView. Класс держателя имеет конструктор, в котором создаются экземпляры всех объектов TextView и ImageView, которые есть в вашем CardView. Затем есть onBindViewHolder — функция переопределения, где тексты или действия устанавливаются для этих представлений, а onClickListeners устанавливаются для этих представлений.

Отличное введение в RecyclerView и способ его создания дано Android:

https://codelabs.developers.google.com/codelabs/android-training-create-recycler-view/index.html?index=..%2F..%2Fandroid-training#0

После некоторого исследования и стука головой о стену я понял, что мне нужно определить LinkedList, который будет состоять из объектов модели. Этот класс модели должен быть создан отдельно, который состоит из всех значений в CardView. Таким образом, когда в RecyclerView добавляется новый элемент, вы создаете новый объект в LinkedList, определяете значения модели, а в адаптере значения модели задаются в представлениях CardView.

После этого шага я реализовал новое действие, когда пользователь щелкал CardView, в котором пользователь мог вводить значения. Одним из основных препятствий, с которыми я столкнулся здесь, было то, что когда я получал дополнительные материалы, выпущенные намерением этого нового действия, когда пользователь возвращался к основному действию (намерение — это, по сути, то, как вы говорите приложению запустить другое действие), я устанавливал значения этой модели, но RecyclerView не будет обновляться. После долгих исследований я обнаружил, что если я просто обновлю активность снова с помощью вызова функции finish() и startActivity(), RecyclerView обновится. Это сработало, потому что finish() и startActivity() перезапускали RecyclerView, который обновлял все значения.

Последним окончательным препятствием было уведомление. Основы разработчика Android учат вас создавать уведомления через AlarmReceiver, но проблема в том, что уведомление не выпускается, если приложение фактически не открыто на смартфоне, что действительно устраняет цель уведомления. После нескольких часов изучения Интернета и с некоторой внешней помощью я обнаружил WorkManager, созданный Google для самой цели запуска, когда приложение закрыто. Таким образом, вы могли бы поместить код для отправки уведомлений в WorkManager. Затем я использовал вызовы PeriodicWorkRequest, которые позволяли бы получать повторяющиеся уведомления, и OneTimeWorkRequest, которые позволяли бы получать уведомления в определенное время.

Наконец, после того, как эти проблемы были решены, я реализовал формат трех вкладок, который по существу использовал три отдельных фрагмента в MainActivity.

Код и пояснения см. в части 3.