Различные типы Item View в RecyclerView

Заметка основана на статье Mateusz Dziubek “Multiple row types in RecyclerView”. Приводится пример создания RecyclerView c различными типами View. В процессе написания код подвергается рефакторингу. Показывается эффективность применения различных паттернов программирования и рефакторинга в целом на простом для понимания примере.

Читать дальше..

Android. Два способа записать результат Timer в пользовательский поток (UI Thread).

Timer в Android - это класс, который позволяет запланировать выполнение задачи на определенное время и, при необходимости, обеспечить циклическое повторение запуска задачи через определенные промежутки времени. Описание задачи дается в классе TimerTask.

Читать дальше..

Зачем нужны интерфейсы в ООП?

На русском Stackoverflow спросили зачем в Java нужны интерфейсы? Народ дал много интересных ответов, но все они так или иначе говорили о том ЧТО есть интерфейс и КАК устроена его реализация. О практической пользе никто не сказал. Т.е. ответ на вопрос для чего используются интерфейсы дан не был. Видимо потому, что для большинства это и так ЯСНО. Но, думаю, есть те, которые понимаю ЧТО и КАК, но не знают ДЛЯ ЧЕГО.

Читать дальше..

Видео. Google I/O '17 Architecture Components - Introduction. Перевод субтитров.

Перевод английских субтитров на русские из видео Architecture Components - Introduction (Google I/O ‘17). Предпринят только для практики перевода с английского, скажем так to improve my reading and listening skills. Делается постепенно. Начало 20.08.2017, конец - 31.08.2017. All rights reserved.

Читать дальше..

Несколько примеров на Kotlin

Просто чтобы не забыть. Первый пример показывает работу с регулярными выражениями, второй - с null и получением элементов массива через лямбда-выражение.

fun main(args: Array<String>) {
    
    //regex
    val month = "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)"
	fun getPattern(): String = """\d{2}\h$month\h\d{4}"""
    val regex = Regex(getPattern())
    val str ="12 DEC 1996"
    val flag = regex.containsMatchIn(str)
    if (flag)
    	println("{$str} is true!")
    else
    	println("{$str} is wrong!")
    
    //null
    val listWithNulls: List<String?> = listOf("A", null, "B", "ERROR 404", null)
	for (item in listWithNulls) {
     	item?.let  {println(it)}  ?: println("element is empty") 
	}
}
Читать дальше..

Python. Задача о нахождении количества уникальных объектов в списке. Два подхода.

Даны следующие условия: Реализуйте программу, которая будет вычислять количество различных объектов в списке. Два объекта a и b считаются различными, если a is b равно False. Вашей программе доступна переменная с названием objects, которая ссылается на список, содержащий не более 100 объектов. Выведите количество различных объектов в этом списке.

Читать дальше..

Xamarin.Forms. Оптимизация ListView.

Картинки, иконки и производительность

Первое, с чем сталкиваются начинающие разработчики на Xamarin.Forms — залипания при прокрутке в списках на базе ListView. Чего греха таить, это одно из болезненных мест платформы, отбрасывающее тень на весь остальной функционал, так как списки используются в больших количествах и практически во всех приложениях.

Читать дальше..

Xamarin.Forms. Ускорение отображения окна (Activity)

Для Xamarin.Forms версии 1.х характерна одна вещь: XAML-файлы интерпретируются на лету, включая создание всех необходимых контролов и их размещение на экране. Из-за этого каждое открытие нового окна со сложной компоновкой происходит дольше, чем хотелось бы.

Читать дальше..

Платформозависимость на Xamarin

Реализация нотификаций на разных платформах:

Здесь нам на помощь приходит DependencyService. Как обычно в кросс-платформенной разработке, нужно объявить интерфейс в общем проекте и реализовать его в платформо-зависимых проектах. Единственным вопросом будет «как определить, какую реализацию вызвать в каждом конкретном случае?». И тут за работу берется DependencyService, магический деятель фреймворка Xamarin. В зависимости от того, для какой платформы мы собираем проект, DependencyService подставляет необходимую реализацию вместо интерфейса. Также стоит отметить, что для того чтобы эта магия заработала, нужно использовать аннотацию Xamarin.Forms.Dependency:

Читать дальше..