• Использовать всегда mutable?

    zagayevskiy
    @zagayevskiy Куратор тега Kotlin
    Android developer at Yandex
    Всегда, когда это возможно, нужно использовать неизменяемые коллекции, и неизменяемые переменные/проперти(val, а не var). Это нужно для того, чтобы сделать интерфейсы и код чище. Хорошо видно, где могут изменяться те или иные данные, а где - не могут, именно для этого иерархия коллекций в котлине разделена на две части. В джаве этого нет, и приходилось делать проверки в рантайме(см Collections.unmodifiableList, например).
    Ответ написан
    Комментировать
  • Как добавить логику парсинга Json, не используя десериализатор?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Да, есть. не надо держать в данных отформатированные поля. Форматировать надо непосредственно перед использованием(например показе во вьюхе). Для этого должен быть отдельный слой, который занимается форматированием всех данных для показа(и это может быть не только форматирование текста).
    Ответ написан
    2 комментария
  • Стоит ли полностью переходить на SingleActivity?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Да, уже давно надо было перейти.
    Такой подход лучше, а не хуже. Лучше тем, что фрагменты можно более-менее нормально анимировать. Также фрагменты между собой в рамках одной активити могут нормально взаимодействовать(target fragment, parent fragment). А активити могут только в интенте передавать данные и получать через onActivityResult.
    Ответ написан
    Комментировать
  • RxJava в 2021. Нужен ли?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    RxJava и корутины немного про разное. Rx это про stateless и представление всего в виде стримов иммутабельных стейтов(данных). Корутины это про stateful и про управление множеством асинхронных сущностей.
    Так сложилось, что в нашем многопоточном мире в обоих подходах есть concurrency. Но это не значит, что надо брать и противопоставлять Rx корутинам.
    Запрос на Rx настолько велик, что в kotlinx завезли flow - это тот же самый реактивный подход, только на основе корутин. С чем боролись, против чего проповедовал Елизаров, на то и напоролись, и ещё наплодили новых операторов, которые тоже надо знать. И усложнили всё чрезвычайно.
    flowOf(123)
       .map(::calculateSomething)
       .filter(::myFilter)
       .collect(::collectIt)

    Сколько в этом коде Асинхронных запросов? В каком месте оно может уснуть навечно? Неизвестно... фреймворк позволяет легко написать код так, что всё взорвется, а ты и не заметишь.
    Хорошо ли то, что с использованием корутин можно писать асинхронный код, по виду идентичный синхронному? Моё мнение - нет, не хорошо, потому что держать в голове две парадигмы про один код - это сложно. А если кто юзал корутины с многопоточностью под iOS(Kotlin/Native), там надо держать в голове три парадигмы про одинаковый код. Это плохо.

    На Rx написано много кода, многим людям без него жить сложно. Многие задачи на Rx решаются настолько проще, что реально думаешь, что без него никак.

    Если тебе корутины или Rx нужны, чтобы в сеть сходить на бекграунде, и потом данные показать в UI - тебе ни корутины, ни Rx особо не нужны.
    Ответ написан
    2 комментария
  • Нужен ли универсальный Adapter для RecyclerView?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Есть такая либа AdapterDelegates. Рекомендую использовать её. Будет универсальный адаптер, и возможность переиспользовать элементы на разных экранах.
    Ответ написан
    Комментировать
  • Как происходит считывание в Haskell?

    zagayevskiy
    @zagayevskiy
    Android developer at Yandex
    Тебе нужна монада IO
    Ответ написан
    Комментировать
  • Как сделать "статичной" переопределенную функцию наследуемую из интерфейсов?

    zagayevskiy
    @zagayevskiy Куратор тега Kotlin
    Android developer at Yandex
    Не знаю, зачем ты такое хочешь, это странно, на мой взгляд. Но можно это заставить работать, достаточно сделать так, чтобы companion object имплементировал этот интерфейс:
    class Tiger {
        companion object : Animal, Cat {
            override fun voice() {
                super<Cat>.voice()
            }
        }
    }
    Ответ написан
    Комментировать
  • Нужно ли объявлять субкомпоненты внутри компонента dagger?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Таким способом ты можешь сказать даггеру, что этот сабкомпонент будет сабом именно к конкретному (или нескольким) компонентам. Это может быть полезно, если ты его(или его фабрику/билдер) хочешь не получать руками из компонента, а заинжектить.
    Например:
    @SubComponent
    interface MySubComponent{
    ...
    }
    
    @Module(subcomponents=[MySubComponent::class])
    interface SubcomponentsModule
    
    @Component(modules=[SubcomponentsModule::class])
    interface MyComponent{
      fun inject(what: MyClass)
    }
    
    class MyClass{
      @Inject 
      lateinit var subcomponent:. MySubComponent
    
      fun inject (){
        // Инжектим с помощью MyComponent
      }


    В этом случае не нужно в интерфейсе компонента писать функцию, возвращающую сабкомпонент.
    А если ты хочешь писать такую функцию, и дергать её руками непосредственно из компонента, то в модуле можно не перечислять.
    Ответ написан
  • Как правильно обернуть работу с REST API и базой данных Room в потоки?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Retrofit сам ходит в сеть на бекграунде, в сеть тебе система не даст сходить на ui thread.
    Насчёт room - похоже, что он тоже не разрешает ходить в себя с ui thread, во всяком случае в интернетах так пишут. Сам с ним не работал, так что это не точно.
    Обратить внимание на RxJava или Kotlin coroutines.
    Ответ написан
    Комментировать
  • Как в Kotlin объявить массив не указывая его размер и элементы?

    zagayevskiy
    @zagayevskiy Куратор тега Kotlin
    Android developer at Yandex
    Использовать mutableListOf. Я массивами уже лет 10 не пользовался в работе, наверное. Только в специфических ситуациях. Не нужно оно.
    Ответ написан
  • Как выполнить скомпилированный Java класс на Android?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Мне кажется, стоит не запариваться, а взять AIDE. Там можно билдить/запускать и джаву, и андроидные приложения, и С++ до кучи.
    Ответ написан
    Комментировать
  • Как менять по свайпу уже открытый activity listview?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Да можно, конечно. Нужно код для этого написать. Использовать ViewPager или RecyclerView + LinearLayoutManager(horizontal). В нем показывать в качестве страницы твою вьюху с камерой.
    Открывать отдельную активити для этого вообще не нужно, надо использовать фрагменты(Fragment).
    Использовать ListView тоже не нужно, нужно использовать RecyclerView + LinearLayoutManager(vertical).
    Ответ написан
    1 комментарий
  • Почему не создаётся компонент Dagger, при написании интерфейса на Kotlin?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Чтобы сгенерился код, нужно запустить kapt.
    Не относится к вопросу, но инжект в конструктор фрагмента это очень плохая затея. Конструктор фрагментов должен быть пустым, и поэтому его проще руками вызывать.
    Ответ написан
  • Как передать данные из фрагмента в таб?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    У координатора нет некаких табов. Тем не менее, есть разные пути.
    Основной путь передачи данных это бандл аргументов (get/setArguments).
    Также, надо понимать, этот твой фрагмент В - дочерний фрагмент(getChildFragmentManager во фрагменте А?). Если да, то они могут общаться напрямую, через getParentFragment во фрагменте В, findFragmentByTag во фрагменте А.
    Если нет, то можно использовать механизм таргет фрагментов (get/setTargetFragment). Или через активити.
    Конечно, лучше кастить не к конкретному классу фрагмента, а к интерфейсу, который будет отображать именно те действия, которые надо.

    У меня есть пара лекций на эту тему, довольно старые, но принципиально мало что изменилось.
    https://youtu.be/3VXPsCUYioM
    https://youtu.be/gD4E_TLbKeU
    Ответ написан
  • Сортировка списка String по заданному слову в строке. Как написать компаратор?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    return list.get(0).split(" ")[finalInput].compareTo(list.get(1).split(" ")[finalInput]);

    Вот здесь твоя ошибка. Компаратор вообще ничего не должен знать про список, попробуй вынести это в отдельный класс, и увидишь, что не получается.
    То, что надо сравнивать, приходит на вход методу compare. Это две строки, которые нужно сравнить, а ты их не используешь. Их споить и сравнивай.
    Ответ написан
    Комментировать
  • Рисование в Kotlin?

    zagayevskiy
    @zagayevskiy Куратор тега Kotlin
    Android developer at Yandex
    В котлине ничего для этого нет. Самого термина "Kotlin Desktop", насколько я знаю, тоже нет. Есть Kotlin/JVM, Kotlin/Native. Хотя, если погуглить по такому запросу, то можно попасть на страницу, где можно найти такой текст:
    Можно ли использовать Kotlin для разработки Desktop-приложений?

    Да. Вы можете использовать любой UI-фреймворк, например JavaFx, Swing и т.д. В добавок, существуют фреймворки для Kotlin, такие как TornadoFX.


    Так что ты берешь произвольный графический фреймворк для джавы, и используешь его в котлине.
    Ответ написан
    Комментировать
  • Почему ListView не реагирует на нажатие кнопки?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    В консоли видно, что names изменяется

    Неправда, этот код ничего не изменяет. Только зачем-то переприсваивает локальную переменную. Начни изменять список. Затем вызывай метод обновления адаптера(notifyDatasetChanged). Затем выкинь листвью и начни уже использовать RecyclerView.
    Ответ написан
    1 комментарий
  • Как передать ArrayList в RecyclerView?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Ты сам в методе makeRecyclerList склеиваешь все свои слова вместе и затем добавляешь эту склейку в список, который потом попадает в адаптер. Перестань это делать и всё.
    Ответ написан
    Комментировать
  • Разница между тегами fragment и FragmentContainerView?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Основная разница в том, что FragmentContainerView позволит тебе динамически заменить фрагмент в рантайме, а fragment - нет.
    И от этого оно уже пляшет, там есть всякие навороты про z-order, чтоб рисовать во время анимации в правильном порядке.

    P.S. fragment это правда тег, а FragmentContainerView это именно вьюха, аналог FrameLayout.
    Ответ написан
  • Как передать данные в другую активити в Android-приложении?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    В современном андроид приложении должна быть одна активити. Больше можно, но обычно не нужно, и нужно чётко понимать, зачем. Экраны разруливаются фрагментами(Fragment).
    Данные в активити можно передать внутри интента(Intent).
    Ответ написан
    Комментировать