Ответы пользователя по тегу Android
  • Как архитектурно правильно управлять пагинацией?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    PagedListAdapter, серьёзно? Гугол в очередной раз родил какую-то хренотень. Похоже, создатели RecyclerView не рассказали автору этой либы, что адаптер никакого отношения к получению данных(коим, конечно, является пагинация) не имеет.

    Короче, как надо. Данные должны прилетать в адаптер списком и он их должен отображать. Где-то во вью слое должна быть подписка на события скроллов ресайклера и определение, доскроллился ли он до конца. Когда доскроллился, нужно оповещать об этом презентационный слой, который попросит у модели ещё данных. Модель вытянет данные, отдаст презентации, данные сконвертятся и отдадутся во вью слой, который передаст их снова в адаптер, который их покажет.

    Конец.

    Никакая либа, которая трогает адаптер и вообще навешивает кучу сущностей, не нужна.

    P.S. статья использует Rx в качестве фреймворка коллбеков. Божественно.
    Ответ написан
    2 комментария
  • Почему при запуске второй активити приложение просто вылетает?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Оно же тебе пишет, ну.
    Caused by: java.lang.IllegalArgumentException: column '_id' does not exist

    CursorAdapter требует, чтобы была колонка с именем "_id". Можешь добавить такой айдишник или добавить в запрос что-то типа SELECT ID AS _id.

    А лучше перестань использовать ListView в целом и CursorAdapter в частности. Переходи на RecyclerView.
    Ответ написан
    Комментировать
  • Как создать ряд кнопок, которые растягиваются по самой широкой?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Что-то я не знаю простого способа это сделать. Вижу два пути - один гарантированный, второй нет.
    Первый путь - наследуешься от LinearLayout, хардкодишь orientation = VERTICAL, переопределяешь onMeasure и в нём измеряешь детей в два прохода - первым спрашиваешь у них, какой они хотят быть ширины и ищешь максимум, второй - выставляешь им ширину exactly максимум. Это всё минимум кода, можно дважды вызвать super.onMeasure. В xml используешь эту кастомную вьюху в качестве контейнера, а всем детям ширину ставишь wrap_content. Если всё сделаешь правильно, получится в точности то, что ты хочешь.
    Второй путь - попробовать поиграть с констреинтами в ConstraintLayout так что вьюхи друг на друга смотрели. К сожалению, не уверен, что это прокатит.
    Ответ написан
    Комментировать
  • Реализовал RecyclerView, но дела до метода onCreateViewHolder даже не доходит! Какая может быть причина этому?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Ты изменяет данные в адаптере, но не нотифицируешь его об этом (notifyDatasetChanged, notify*, DiffUtil).
    Ответ написан
  • Почему первый Fragment в Tablayout прогружается только после нажатия на 3-ю и далее вкладки?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    В общем проблема твоя в асинхронной загрузке данных и в статике.
    Всё происходит так: ты заходишь на экран, адаптер создаётся моментально и наполняется из Mnd. Данные там - 1 элемент. Потом данные загружаются, статика обновляется, но адаптер никто об этом не оповещает(notify*). Дальше ты начинаешь ходить по другим страницам, в какой-то момент возвращаешься, и вуаля, создаёшь новый адаптер со свежими данными.
    Что делать. Паттерн репозиторий и паттерн обзервер (или прекрути RxJava). Никакой статики нафиг. Тебе сразу придется думать, что ты делаешь, сначала будет трудно, но это необходимо. Выкинуть асинктаск и забыть о нём как о страшном сне. Retrofit+okhttp+moshi. Никакого парсинга руками джсона, тем более на мейнтреде.
    Ответ написан
    1 комментарий
  • Почему не работает setOnclickListener?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Оно не знает, что такое btnOk, потому что ты нигде не объявил такую переменную.
    val btnOk = findViewById<Button>(R.id.btnOk)
    Если в другом проекте такого кода нет, и всё работает, значит там используется Kotlin android extensions. В build.gradle нужно подключить:
    apply plugin: 'kotlin-android-extensions'
    Ответ написан
  • Как сделать чтобы при закрытии фрагмента к нему перестали обращаться?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Омагад.
    Читай про structured concurrency. Читай про жизненный цикл фрагментов.
    Всё происходит из-за того, что ты неправильно обращаешься с ними. Из-за того, что ты поменял один инструмент на другой, неправильное обращение никуда не делось. Ты должен отменить скоуп при выходе с фрагмента(в onDestroyView). И обращаться в мейнтред через MainDispatcher, раз уж ты используешь корутины.
    Ответ написан
  • Как пользоваться Bottom Sheet?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    И не найдешь, потому что на активити это сделать нельзя. Должна быть одна активити, а то, где "играет музыка" - ещё один фрагмент. От этого можно плясать.
    Ответ написан
    2 комментария
  • Как реализовать добавление в избранное?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Ну в общем есть такой паттер Repository, надо его использовать. Внутри нужно держать бд, без вариантов. Представь, если я 1000 песен добавлю в избранное. Все эти варианты стремные с файлами и преференсами будут тормозить.
    Ещё есть вариант бд держать на сервере, а запросы к ней делать прозрачно по хттп апи через тот же репозиторий.
    Ответ написан
  • Как скрыть Float Action Button при скролле RecyclerView?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Подписаться на скроллы и скрывать/показывать, когда нужно.
    Ответ написан
    Комментировать
  • Какие технологии андроид-разработки актуальны в 2020?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Я бы сказал
    Kotlin, RxJava+RxAndroid+RxKotlin, Conductor, Dagger 2, Retrofit+okhttp, Moshi, Glide, AdapterDelegates, Timber, Firebase, SQLDelight. Может что-то забыл, но на первое время точно хватит.

    Ещё сейчас форсятся корутины, почти везде есть к ним биндинги. Но я бы не стал, не нравятся они мне. Пользуюсь только по необходимости (мультиплатформа).
    Либы, которые форсят архитектуру, имхо, нафиг, проще писать руками, ничего там такого сложного нет. Но Architecture components можно посмотреть, иногда полезно. И архитектуры выбранной придерживаться.

    Jetpack compose не так чтобы production-ready, хоть его и форсят из всех углов.
    Flutter от всего этого сбоку находится, там своя атмосфера, пишут на Dart, и с обычным приложением это всё плюс-минус несовместимо.
    splitties посмотрел, полезно, но, имхо, в любом более-менее крупном проекте возникнет своя библиотека экстеншнов, а искать на каждый чик там зависимость.. ну такое. Проще за пару минут своё написать.
    Ответ написан
    3 комментария
  • AsyncTask Как обновлять вью, если класс таск не вложенный?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Если прям сильно надо, то в конструктор передается WeakReference<ЧтоХочешьОбновлять>
    Но лучше вообще не использовать AsyncTask. Это древняя штука с очень плохим апи.
    Ответ написан
  • Почему не работает фильтр?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    если "100000", "999999999" ты передаешь в метод filter, то очевидно, что получающееся в результате конкатенации число не влезает в int.
    Ответ написан
    Комментировать
  • Ошибка при сравнении двух строк в Java(Android)?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Очевидно, movie.getLanguage() == null.
    Либо ошибка не в этой строке.
    Можно использовать Objects.equals()
    Ответ написан
    Комментировать
  • Как вызвать простейший Java метод из Android ndk?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Гугли jni.
    Например вот.
    Кратко, тебе из джавы приходит JNIEnv* у которого две сотни разных методов на тему взаимодействия с джавой. И ты нетипобезопасно, в рефлексивном стиле ищешь методы у объектов, и дергаешь их.
    Ответ написан
    Комментировать
  • Как получить информацию по песни из URI?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    На этой странице есть всё, что тебе надо.
    Ответ написан
  • Не обновляется ProgressBar(Android)?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Во-первых потому что все твои вызовы обновлений происходят подряд и все они выполнятся на следующем фрейме, то есть эффективно будет показано только последнее обновление. Элементы в список добавляются примерно мгновенно, то есть никакого обновления UI там не будет.
    Во-вторых, я думаю, что ты считаешь прогресс неправильно: (movies.size()/1962)*100. Не знаю, что за магическое число, но думаю, что там всегда 0 получается. Это целочисленное деление.
    Ответ написан
    Комментировать
  • Почему не работает setOnItemClickListener в ListView?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Не надо использовать ListView. Используй RecyclerView. Обработчик кликов ставь непосредственное на вьюху.
    В твоей случае, я думаю, одна из вьюх перехватывает клики(чекбокс, наверное).
    Ответ написан
    6 комментариев
  • Как открыть ссылку из WebView в новом activity с WebView?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Очевидно, на какую-то строку, содержащую url.
    Ответ написан
    Комментировать
  • Как происходит компиляция приложения на Kotlin под IOS?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Как человек, проработавший больше года на данный момент с kmpp, могу сказать, что ты не потянешь. Технология, в принципе, рабочая, но очень сырая.
    Твои вопросы поставлены некорректно. Сама компиляция не так уж сложна. Сложен процесс разработки, который позволит её осуществить. Если ты просто напишешь приложение под Андроид, оно у тебя никогда не скомпилируется под айос. Потому что библиотеки и фреймворк другие. Чтобы сделать мультиплатформенное приложение, нужно делать его с самого начала таким. А чтобы писать на котлине под айос, тебе придется изучить фреймворки айосные. Материалов на котлине про это нет, так что придется изучать на свифте и самому адаптировать под котлин. Это сложно, там дикая куча граблей. Использовать тот же SwiftUI из котлина нельзя, можно только то, что имеет Objective-C api.
    Кроме того, в нативе очень большие проблемы с моделью памяти. Написать мультитредовый код для двух платформ очень сложно. А мультитрединг нужен хотя бы для походов в сеть и бд. Если кто-то скажет тебе "корутины" - смейся над ним, корутины в нативе однопоточные. Елизаров и ко не смогли с текущей моделью памяти реализовать многопоточные нативные корутины. Сказали, что ушли думать, будут переделывать модель памяти.

    Вывод: изучай себе спокойно андроид, доводи до ума приложение. Это сложно, и займёт у тебя достаточно времени. Захочешь айос - изучишь Свифт или найдёшь единомышленника:)
    Ответ написан