{"id":279131,"date":"2016-04-26T19:35:04","date_gmt":"2016-04-26T15:35:04","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=279131"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=279131","title":{"rendered":"\u041f\u0438\u0448\u0435\u043c MVP \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Kotlin \u043f\u043e\u0434 Android"},"content":{"rendered":"\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/ad1\/e16\/e49\/ad1e16e4935a4ca487ccd75f7aa277fe.png\"\/><\/div>\n<p>  \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Kotlin \u043f\u043e\u0434 Android \u043d\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u0441\u0440\u0435\u0434\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043e\u0434\u043d\u0430\u043a\u043e \u0441\u0442\u0430\u0442\u0435\u0439 \u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u043e. \u042f \u0440\u0435\u0448\u0438\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Kotlin. \u041c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u0441\u0435\u0445 \u0442\u0440\u0435\u043d\u0434\u043e\u0432\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a (\u043a\u0440\u043e\u043c\u0435 RxJava) \u0432 \u043c\u0438\u0440\u0435 Android-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0443 \u043d\u0430\u0441 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u043e\u0435 \u0438 \u043b\u0435\u0433\u043a\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (\u0441\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u044b \u043c\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c).<a name=\"habracut\"><\/a><\/p>\n<p>  \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u0432\u0430\u0441 \u0437\u043d\u0430\u044e\u0442, \u0447\u0442\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Kotlin JetBrains \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/github.com\/Kotlin\/anko\">Anko<\/a>, \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f UI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u043c\u0435\u043d\u044b \u043e\u0431\u044b\u0447\u043d\u044b\u043c XML-\u0444\u0430\u0439\u043b\u0430\u043c. \u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0434\u0430\u0431\u044b \u043d\u0435 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043b\u044e\u0434\u0435\u0439 \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0445 \u0441 Anko.<\/p>\n<p>  <b>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435:<\/b> \u044f\u043a\u043e\u0440\u0438 \u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0438 \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442. \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0435\u0442\u0435 \u043a\u0430\u043a \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u041b\u0421, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/p>\n<p>  \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435:  <\/p>\n<ul>\n<li><a href=\"#ide-configuring\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Android Studio<\/a><\/li>\n<li><a href=\"#what-will-write\">\u0427\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c?<\/a><\/li>\n<li><a href=\"#application-structure\">\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/a><\/li>\n<li><a href=\"#creating-model\">\u0421\u043e\u0437\u0434\u0430\u0435\u043c Model<\/a><\/li>\n<li><a href=\"#main-screen\">\u042d\u043a\u0440\u0430\u043d \u0441 \u0437\u0430\u043c\u0435\u0442\u043a\u0430\u043c\u0438<\/a><br \/> \n<ul>\n<li><a href=\"#creating-main-vp\">\u0421\u043e\u0437\u0434\u0430\u0435\u043c MainView \u0438 MainPresenter<\/a><\/li>\n<li><a href=\"#notes-search\">\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0437\u0430\u043c\u0435\u0442\u043a\u0430\u043c<\/a><\/li>\n<li><a href=\"#notes-sorting\">\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0437\u0430\u043c\u0435\u0442\u043e\u043a<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#note-screen\">\u042d\u043a\u0440\u0430\u043d \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u043c \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/a><br \/> \n<ul>\n<li><a href=\"#creating-note-vp\">\u0421\u043e\u0437\u0434\u0430\u0435\u043c NoteView \u0438 NotePresenter<\/a><\/li>\n<li><a href=\"#note-saving\">\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#thanks\">\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u0438<\/a><\/li>\n<li><a href=\"#conclusion\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h1>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Android Studio<\/h1>\n<p>  \u0414\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Kotlin, Android Studio \u043d\u0443\u0436\u0435\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"http:\/\/java-help.ru\/kotlin-introduction\/\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u00abInstant Run\u00bb \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 Android Studio, \u0442. \u043a. \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u043d\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c Kotlin.<\/p>\n<p>  \u0414\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043d\u0435 \u043d\u0438\u0436\u0435 1.0.1. \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0432\u0435\u0440\u0441\u0438\u044e <a href=\"https:\/\/discuss.kotlinlang.org\/t\/kotlin-1-0-2-eap\/1581\/1\">Kotlin 1.0.2 EAP<\/a>. \u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0444\u0430\u0439\u043b build.gradle \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043c\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435:<\/p>\n<pre><code class=\"java\">apply plugin: 'com.android.application' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-android'  android {     compileSdkVersion 23     buildToolsVersion &quot;23.0.2&quot;      defaultConfig {         applicationId &quot;imangazaliev.notelin&quot;         minSdkVersion 15         targetSdkVersion 23         versionCode 1         versionName &quot;1.0&quot;     }      buildTypes {         release {             minifyEnabled false             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'         }     }     sourceSets {         main.java.srcDirs += 'src\/main\/kotlin'         androidTest.java.srcDirs += 'src\/androidTest\/kotlin'     } }  dependencies {     ... }  kapt {     generateStubs = true }  buildscript {     ext.kotlin_version = '1.0.2-eap-15'     repositories {         mavenCentral()         maven { url 'https:\/\/dl.bintray.com\/kotlin\/kotlin-eap' }     }     dependencies {         classpath &quot;org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version&quot;     } } repositories {     mavenCentral() } <\/code><\/pre>\n<p>  <\/p>\n<h1>\u0427\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c?<\/h1>\n<p>  \u0418\u0442\u0430\u043a, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0447\u0442\u043e \u0436\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c? \u041d\u0435\u0434\u043e\u043b\u0433\u043e \u0434\u0443\u043c\u0430\u044f \u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438-\u0437\u0430\u043c\u0435\u0442\u043a\u0430\u0445. \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u0436\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u043e\u0441\u044c \u043b\u0435\u0433\u043a\u043e \u2014 Notelin. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u044d\u043a\u0440\u0430\u043d\u043e\u0432:<\/p>\n<p>   \u2014 \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d \u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0437\u0430\u043c\u0435\u0442\u043a\u0430\u043c\u0438<br \/>   \u2014 \u042d\u043a\u0440\u0430\u043d \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u2014 \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c\/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/p>\n<p>  \u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435: <\/p>\n<p>   \u2014 \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\/\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438<br \/>   \u2014 \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0437\u0430\u043c\u0435\u0442\u043a\u0435<br \/>   \u2014 \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443 \u0438 \u043f\u043e \u0434\u0430\u0442\u0435<br \/>   \u2014 \u041f\u043e\u0438\u0441\u043a \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c \u0437\u0430\u043c\u0435\u0442\u043e\u043a<\/p>\n<h1>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/h1>\n<p>  \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <b>Android Active<\/b>. \u0423\u0440\u043e\u043a \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043d\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e \u044d\u0442\u043e\u0439 <a href=\"http:\/\/java-help.ru\/activeandroid-orm-review\/\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>. \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Depency Injection \u0431\u044b\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Dagger 2. \u041d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043d\u0435\u0439. \u041e\u0441\u043d\u043e\u0432\u043e\u0439 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"https:\/\/habrahabr.ru\/post\/276189\/\">Moxy<\/a>. \u0421 \u0435\u0435 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d MVP \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u041e\u043d\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043e \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u0430 Kotlin \u0432 Android \u2014 <a href=\"https:\/\/github.com\/pawegio\/KAndroid\">KAndroid<\/a>. \u041f\u0440\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u044f \u0431\u0443\u0434\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e \u0445\u043e\u0434\u0443 \u0434\u0435\u043b\u0430. <\/p>\n<p>  \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<pre><code class=\"java\">allprojects {     repositories {         jcenter()         mavenCentral()         maven { url &quot;https:\/\/oss.sonatype.org\/content\/repositories\/snapshots\/&quot; }         maven { url &quot;https:\/\/mvn.arello-mobile.com\/&quot; }         maven { url &quot;https:\/\/jitpack.io&quot; }         maven { url 'https:\/\/dl.bintray.com\/kotlin\/kotlin-eap' }     } } <\/code><\/pre>\n<p>  \u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"java\">dependencies {     compile &quot;org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version&quot;     compile &quot;com.android.support:appcompat-v7:23.1.1&quot;     compile 'com.android.support:recyclerview-v7:23.1.1'     compile 'com.android.support:cardview-v7:23.1.1'     \/\/\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f Android Kotlin     compile 'com.pawegio.kandroid:kandroid:0.5.0@aar'     \/\/ActiveAndroid DB     compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'     \/\/FAB     compile 'com.melnykov:floatingactionbutton:1.3.0'     \/\/MaterialDialog     compile 'com.github.afollestad.material-dialogs:core:0.8.5.6@aar'     \/\/MVP     compile 'com.arello-mobile:moxy:0.4.2'     compile 'com.arello-mobile:moxy-android:0.4.2'     kapt 'com.arello-mobile:moxy-compiler:0.4.2'     \/\/RX     compile 'io.reactivex:rxjava:1.1.0'     compile 'io.reactivex:rxandroid:1.1.0'     \/\/Depency Injection     kapt 'com.google.dagger:dagger-compiler:2.0.2'     compile 'com.google.dagger:dagger:2.0.2'     provided 'org.glassfish:javax.annotation:10.0-b28'     \/\/EventBus     compile 'org.greenrobot:eventbus:3.0.0' } <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u043c\u0435\u0441\u0442\u043e apt \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <a href=\"http:\/\/blog.jetbrains.com\/kotlin\/2015\/06\/better-annotation-processing-supporting-stubs-in-kapt\/\">kapt<\/a>. \u042d\u0442\u043e \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f Gradle, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0430\u043d\u043d\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c Kotlin-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.<\/p>\n<h1>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h1>\n<p>  \u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/d9d\/739\/b13\/d9d739b131b74d4d807d6a62e35dd674.png\"\/><\/p>\n<h1>\u0421\u043e\u0437\u0434\u0430\u0435\u043c Model<\/h1>\n<p>  \u0423 \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u0447\u0435\u0442\u044b\u0440\u0435 \u043f\u043e\u043b\u044f:<\/p>\n<ul>\n<li>\u0414\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f<\/li>\n<li>\u0414\u0430\u0442\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f<\/li>\n<li>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a<\/li>\n<li>\u0422\u0435\u043a\u0441\u0442<\/li>\n<\/ul>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432\u0441\u0435 \u044d\u0442\u043e \u0432 \u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"java\">class Note : Model {      @Column(name = &quot;title&quot;)     public var title: String? = null     @Column(name = &quot;text&quot;)     public var text: String? = null     @Column(name = &quot;create_date&quot;)     public var createDate: Date? = null     @Column(name = &quot;change_date&quot;)     public var changeDate: Date? = null      constructor(title: String, createDate: Date, changeDate: Date) {         this.title = title         this.createDate = createDate         this.changeDate = changeDate     }      constructor()      fun getInfo(): String = &quot;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435:\\n$title\\n&quot; +                                        &quot;\u0412\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f:\\n${DateUtils.formatDate(createDate)}\\n&quot; +                                        &quot;\u0412\u0440\u0435\u043c\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:\\n${DateUtils.formatDate(changeDate)}&quot;; } <\/code><\/pre>\n<p>  \u041f\u043e \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 ActiveAndroid \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0411\u0414, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u0448\u0438 \u0437\u0430\u043c\u0435\u0442\u043a\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430: \u043f\u0443\u0441\u0442\u043e\u0439 \u0438 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438. \u041f\u0435\u0440\u0432\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u044b, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 ActiveAndroid. \u041d\u0430\u0448\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 Model, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043d\u0430\u0448\u0438 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u044f \u043c\u0435\u0442\u043e\u0434\u044b <b>save()<\/b> \u0438 <b>delete()<\/b>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"java\">var note = Note(&quot;\u041d\u043e\u0432\u0430\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0430&quot;, Date()) note.save() ... note.delete() <\/code><\/pre>\n<p>  \u041d\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u043c\u043e\u0434\u0435\u043b\u044c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0435-\u043a\u0430\u043a\u0438\u0435 \u043c\u0435\u0442\u0430-\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 Manifest-\u0444\u0430\u0439\u043b\u0435:<\/p>\n<pre><code class=\"xml\">&lt;meta-data android:name=&quot;AA_DB_NAME&quot; android:value=&quot;Notelin.db&quot; \/&gt; &lt;meta-data android:name=&quot;AA_DB_VERSION&quot; android:value=&quot;1&quot; \/&gt; <\/code><\/pre>\n<p>  \u0414\u0443\u043c\u0430\u044e, \u0432\u0441\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0431\u0435\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 Application \u043e\u0442 com.activeandroid.app.Application:<\/p>\n<pre><code class=\"java\">class NotelinApplication : Application() { ... } <\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043c\u0435\u043d\u0435\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0411\u0414 \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u043e\u0431\u0435\u0440\u0442\u043a\u0443 <a href=\"https:\/\/github.com\/ImangazalievM\/Notelin\/blob\/master\/app\/src\/main\/kotlin\/imangazaliev\/notelin\/mvp\/models\/NoteWrapper.kt\">NoteWrapper<\/a> \u043d\u0430\u0434 \u043d\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044e \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u0437\u0430\u043c\u0435\u0442\u043e\u043a:<\/p>\n<pre><code class=\"java\">class NoteWrapper {      \/**      * \u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u0437\u0430\u043c\u0435\u0442\u043a\u0443      *\/     fun createNote(): Note {         var note = Note(&quot;\u041d\u043e\u0432\u0430\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0430&quot;, Date())         note.save()         return note     }      \/**      * \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u043a\u0443 \u0432 \u0411\u0414      *\/     fun saveNote(note: Note) : Long {         return note.save()     }      \/**      * \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0432\u043e View      *\/     fun loadAllNotes() : List&lt;Note&gt; {         return Select().from(Note::class.java).execute&lt;Note&gt;()     }      \/**      * \u0418\u0449\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u043a\u0443 \u043f\u043e id \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0435      *\/     fun getNoteById(noteId:Long) : Note {         return Select().from(Note::class.java).where(&quot;id = ?&quot;, noteId).executeSingle&lt;Note&gt;()     }      \/**      * \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438      *\/     fun deleteAllNotes()  {         Delete().from(Note::class.java).execute&lt;Note&gt;();     }      \/**      * \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u043a\u0443 \u043f\u043e id      *\/     fun deleteNote(note:Note)  {         note.delete()     }  } <\/code><\/pre>\n<p>  \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0447\u0442\u043e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <b>new<\/b> \u2014 \u044d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u0438\u0435 Kotlin \u043e\u0442 Java. <\/p>\n<p>  <\/p>\n<h1>\u042d\u043a\u0440\u0430\u043d \u0441 \u0437\u0430\u043c\u0435\u0442\u043a\u0430\u043c\u0438<\/h1>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u044d\u043a\u0440\u0430\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u0430 \u043d\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c\/\u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0443, \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u043c\u0435\u0442\u043a\u0435, \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e \u0434\u0430\u0442\u0435 \u0438\u043b\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c.<\/p>\n<p>  <\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0435\u043c MainView \u0438 MainPresenter<\/h3>\n<p>  <img decoding=\"async\" width=\"40%\" src=\"https:\/\/habrastorage.org\/files\/10b\/d1e\/6b8\/10bd1e6b8e08489abc94a0c89c9c74c4.png\"\/><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u0432 \u043a\u043e\u0434. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0430\u0448\u0435\u0439 View:<\/p>\n<pre><code class=\"java\">@StateStrategyType(value = AddToEndSingleStrategy::class) interface MainView : MvpView {      fun onNotesLoaded(notes: ArrayList&lt;Note&gt;)      fun updateView()      fun onSearchResult(notes: ArrayList&lt;Note&gt;)      fun onAllNotesDeleted()      fun onNoteDeleted()      fun showNoteInfoDialog(noteInfo: String)      fun hideNoteInfoDialog()      fun showNoteDeleteDialog(notePosition: Int)      fun hideNoteDeleteDialog()      fun showNoteContextDialog(notePosition: Int)      fun hideNoteContextDialog()  } <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432 \u043d\u0430\u0448\u0435\u0439 \u0430\u043a\u0442\u0438\u0432\u0438\u0442\u0438:<\/p>\n<pre><code class=\"java\">class MainActivity : MvpAppCompatActivity(), MainView { <\/code><\/pre>\n<p>  \u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 Kotlin, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0438\u043c\u0435\u043d\u0438 \u043a\u043b\u0430\u0441\u0441\u0430. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u0438\u0434\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u0435\u0440\u0435\u0434 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c\u0438, \u043f\u043e\u0441\u043b\u0435 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438, \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u043a\u043b\u0430\u0441\u0441 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0431\u044b\u043b \u043e\u0434\u0438\u043d. \u0422. \u0435. \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u044b\u0448\u0435 \u043c\u043e\u0433\u043b\u0430 \u0431\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">class MainActivity : MainView, MvpAppCompatActivity() { <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0436\u0435 \u0432\u044b \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0435\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0435\u0449\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u0442\u043e IDE \u0432\u044b\u0434\u0430\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u0438 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0435\u0442 \u043a\u0440\u0430\u0441\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0435\u0439 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0434\u0435\u0442 \u0432\u0442\u043e\u0440\u044b\u043c.<\/p>\n<p>  \u041f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0443\u0441\u0442\u044b\u043c\u0438. \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u0430\u043a\u0442\u0438\u0432\u0438\u0442\u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 <a href=\"https:\/\/github.com\/ImangazalievM\/Notelin\/blob\/master\/app\/src\/main\/kotlin\/imangazaliev\/notelin\/mvp\/common\/MvpAppCompatActivity.java\">MvpAppCompatActivity<\/a>. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0430\u043a\u0442\u0438\u0432\u0438\u0442\u0438 \u043c\u043e\u0433\u043b\u0430 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0435 \u044d\u043a\u0440\u0430\u043d\u0430. <\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0435\u0440:<\/p>\n<pre><code class=\"java\">@InjectViewState class MainPresenter : MvpPresenter&lt;MainView&gt; {  } <\/code><\/pre>\n<p>  \u041f\u0440\u0435\u0437\u0435\u043d\u0442\u0435\u0440 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 MvpPresenter, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0441 \u043a\u0430\u043a\u043e\u0439 View \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u043c\u043e\u0434\u0435\u043b\u044c \u0432 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0435\u0440. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044c \u2014 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430 NoteWrapper:<\/p>\n<pre><code class=\"java\">@Module class NoteWrapperModule {      @Provides     @Singleton     fun provideNoteWrapper() : NoteWrapper= NoteWrapper()  } <\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c Component \u0434\u043b\u044f \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0435\u0440\u0430:<\/p>\n<pre><code class=\"java\">@Singleton @Component(modules = arrayOf(NoteWrapperModule::class)) interface AppComponent {      fun inject(mainPresenter : MainPresenter)  } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 AppComponent \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 Application:<\/p>\n<pre><code class=\"java\">class NotelinApplication : Application() {      companion object {         lateinit var graph: AppComponent     }      override fun onCreate() {         super.onCreate()          graph = DaggerAppComponent.builder().noteWrapperModule(NoteWrapperModule()).build()     }  } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u043c\u043e\u0434\u0435\u043b\u044c \u0432 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0435\u0440\u0435:<\/p>\n<pre><code class=\"java\">@InjectViewState class MainPresenter : MvpPresenter&lt;MainView&gt; {      @Inject     lateinit var mNoteWrapper: NoteWrapper      constructor() : super() {         NotelinApplication.graph.inject(this)     }  } <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f MainView \u0438 MainPresenter \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432 MainActivity:<\/p>\n<pre><code class=\"java\">@InjectPresenter lateinit var mPresenter: MainPresenter <\/code><\/pre>\n<p>  \u041f\u043b\u0430\u0433\u0438\u043d Moxy \u0441\u0430\u043c \u043f\u0440\u0438\u0432\u044f\u0436\u0435\u0442 View \u043a \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0443 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.<\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0443 \u044d\u043a\u0440\u0430\u043d\u0430 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0438 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439. \u0424\u0430\u0439\u043b <b>activity_main.xml<\/b>:<\/p>\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;FrameLayout     xmlns:app=&quot;http:\/\/schemas.android.com\/apk\/res-auto&quot;     xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;     xmlns:tools=&quot;http:\/\/schemas.android.com\/tools&quot;     android:layout_width=&quot;match_parent&quot;     android:layout_height=&quot;match_parent&quot;     tools:context=&quot;.ui.activities.MainActivity&quot;&gt;     &lt;TextView         android:id=&quot;@+id\/tvNotesIsEmpty&quot;         android:layout_width=&quot;match_parent&quot;         android:layout_height=&quot;match_parent&quot;         android:text=&quot;@string\/notes_is_empty&quot;         android:gravity=&quot;center&quot;         \/&gt;     &lt;android.support.v7.widget.RecyclerView         android:id=&quot;@+id\/rvNotesList&quot;         android:layout_width=&quot;match_parent&quot;         android:layout_height=&quot;match_parent&quot;         android:scrollbars=&quot;vertical&quot;         app:layoutManager=&quot;android.support.v7.widget.LinearLayoutManager&quot;         \/&gt;     &lt;com.melnykov.fab.FloatingActionButton         android:id=&quot;@+id\/fabButton&quot;         android:layout_width=&quot;wrap_content&quot;         android:layout_height=&quot;wrap_content&quot;         android:layout_gravity=&quot;bottom|right&quot;         android:layout_margin=&quot;16dp&quot;         android:src=&quot;@mipmap\/ic_add&quot;         app:fab_colorNormal=&quot;@color\/colorPrimary&quot;         app:fab_colorPressed=&quot;@color\/colorPrimaryDark&quot; \/&gt; &lt;\/FrameLayout&gt; <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043b\u0435\u0442\u0430\u044e\u0449\u0435\u0439 \u043a\u043d\u043e\u043f\u043a\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/github.com\/makovkastar\/FloatingActionButton\">FloatingActionButton<\/a>. Google \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 FAB \u0432 support-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p>  \u0423\u043a\u0430\u0436\u0435\u043c \u043d\u0430\u0448\u0435\u0439 Activity, \u043a\u0430\u043a\u043e\u0439 \u043c\u0430\u043a\u0435\u0442 \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c:<\/p>\n<pre><code class=\"java\">    override fun onCreate(savedInstanceState: Bundle?) {         super.onCreate(savedInstanceState)         setContentView(R.layout.activity_main)      } <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u0442\u044c FAB \u0438 \u0441\u043f\u0438\u0441\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u043d\u0438\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0432\u0435\u0440\u0445 \u043a\u043d\u043e\u043f\u043a\u0430 \u0438\u0441\u0447\u0435\u0437\u0430\u043b\u0430:<\/p>\n<pre><code class=\"java\">fabButon.attachToRecyclerView(rvNotesList) <\/code><\/pre>\n<p>  \u041d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u043d\u0430\u0434\u043e\u0435\u0432\u0448\u0438\u0439 <b>findViewById<\/b>, \u043d\u0443\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u0432 \u0431\u043b\u043e\u043a\u0435 \u0441 import&#8217;\u0430\u043c\u0438:<\/p>\n<pre><code class=\"java\">import kotlinx.android.synthetic.main.activity_main.* <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0430\u043a\u0435\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0430\u0448\u0435\u0433\u043e xml-\u0444\u0430\u0439\u043b\u0430. IDE \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 (property) \u043d\u0430\u0448\u0438\u0445 View \u0438 \u0438\u0445 \u0438\u043c\u0435\u043d\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441 ID, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u0432 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0435.<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u0438\u0437 \u0411\u0414. \u0417\u0430\u043c\u0435\u0442\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c. \u0412 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 onFirstViewAttach \u043a\u043b\u0430\u0441\u0441\u0430 MvpPresenter, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u043e\u0436\u0434\u044b \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0435 View \u043a \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0435\u0440\u0443. \u0414\u0430\u043b\u0435\u0435, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u044b \u043c\u044b \u043d\u0435 \u043a\u0440\u0443\u0442\u0438\u043b\u0438 \u0438 \u0432\u0435\u0440\u0442\u0435\u043b\u0438 \u043d\u0430\u0448\u0443 Activity, \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0435\u0440\u0435.<\/p>\n<pre><code class=\"java\">override fun onFirstViewAttach() {     super.onFirstViewAttach()      loadAllNotes()     }  \/** * \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0432\u043e View *\/ fun loadAllNotes() {     mNotesList = mNoteWrapper.loadAllNotes() as ArrayList&lt;Note&gt;     viewState.onNotesLoaded(mNotesList) } <\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430: <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">class NotesAdapter : RecyclerView.Adapter&lt;NotesAdapter.ViewHolder&gt; {      private var mNotesList: List&lt;Note&gt; = ArrayList()      constructor(notesList: List&lt;Note&gt;) {         mNotesList = notesList     }      \/**      * \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 View \u0438 ViewHolder \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043f\u0438\u0441\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f.      *\/     override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ViewHolder {         var v = LayoutInflater.from(viewGroup.context).inflate(R.layout.note_item_layout, viewGroup, false);         return ViewHolder(v);     }      \/**      * \u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 View \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441 \u043d\u043e\u043c\u0435\u0440\u043e\u043c i      *\/     override     fun onBindViewHolder(viewHolder: ViewHolder, i: Int) {         var note = mNotesList[i];         viewHolder.mNoteTitle.text = note.title;          viewHolder.mNoteDate.text = DateUtils.formatDate(note.changeDate);     }      override fun getItemCount(): Int {         return mNotesList.size     }      \/**      * \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 ViewHolder, \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0433\u043e \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u044b.      *\/      class ViewHolder : RecyclerView.ViewHolder {          var mNoteTitle: TextView         var mNoteDate: TextView          constructor(itemView: View) : super(itemView) {             mNoteTitle = itemView.findViewById(R.id.tvItemNoteTitle) as TextView             mNoteDate = itemView.findViewById(R.id.tvItemNoteDate) as TextView         }      }  } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 DateUtils. \u041e\u043d \u0441\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u0442\u044b \u0432 \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<pre><code class=\"java\">class DateUtils {      companion object {          fun formatDate(date: Date?): String {             var dateFormat = SimpleDateFormat(&quot;yyyy-MM-dd HH:mm&quot;);             return dateFormat.format(date)         }      }  } <\/code><\/pre>\n<p>  \u0422. \u043a. \u0432 Kotlin \u043d\u0435\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 static, \u044f \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b \u043c\u0435\u0442\u043e\u0434 <i>formatDate<\/i> \u0432 \u0431\u043b\u043e\u043a <b>companion object<\/b> \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u043c\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u0430\u043a \u043a \u043e\u0431\u044b\u0447\u043d\u043e\u043c\u0443 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u043c\u0435\u0442\u043e\u0434\u0443. \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 onNotesLoaded \u043d\u0430\u0448\u0435\u0439 Activity \u043c\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0448\u0438 \u0437\u0430\u043c\u0435\u0442\u043a\u0438: <\/p>\n<pre><code class=\"java\">override fun onNotesLoaded(notes: ArrayList&lt;Note&gt;) {     rvNotesList.adapter = NotesAdapter(notes)     updateView() }  override fun updateView() {     rvNotesList.adapter.notifyDataSetChanged()     if (rvNotesList.adapter.itemCount == 0) {         rvNotesList.visibility = View.GONE         tvNotesIsEmpty.visibility = View.VISIBLE     } else {         rvNotesList.visibility = View.VISIBLE         tvNotesIsEmpty.visibility = View.GONE     } } <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u043d\u0435\u0442, \u0442\u043e \u043c\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u00ab\u041d\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u043e\u043a\u00bb \u0432 TextView.<\/p>\n<p>  \u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f \u0437\u043d\u0430\u044e, \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043b\u0438\u043a\u0430 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c RecycleView \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u00ab\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e\u00bb OnItemClickListener. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">ItemClickSupport.java<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">public class ItemClickSupport {      private final RecyclerView mRecyclerView;     private OnItemClickListener mOnItemClickListener;     private OnItemLongClickListener mOnItemLongClickListener;      private View.OnClickListener mOnClickListener = new View.OnClickListener() {         @Override         public void onClick(View v) {             if (mOnItemClickListener != null) {                 RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);                 mOnItemClickListener.onItemClicked(mRecyclerView, holder.getAdapterPosition(), v);             }         }     };      private View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() {         @Override         public boolean onLongClick(View v) {             if (mOnItemLongClickListener != null) {                 RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);                 return mOnItemLongClickListener.onItemLongClicked(mRecyclerView, holder.getAdapterPosition(), v);             }             return false;         }     };      private RecyclerView.OnChildAttachStateChangeListener mAttachListener = new RecyclerView.OnChildAttachStateChangeListener() {         @Override         public void onChildViewAttachedToWindow(View view) {             if (mOnItemClickListener != null) {                 view.setOnClickListener(mOnClickListener);             }             if (mOnItemLongClickListener != null) {                 view.setOnLongClickListener(mOnLongClickListener);             }         }          @Override         public void onChildViewDetachedFromWindow(View view) {          }     };      private ItemClickSupport(RecyclerView recyclerView) {         mRecyclerView = recyclerView;         mRecyclerView.setTag(R.id.item_click_support, this);         mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener);     }      public static ItemClickSupport addTo(RecyclerView view) {         ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);         if (support == null) {             support = new ItemClickSupport(view);         }         return support;     }      public static ItemClickSupport removeFrom(RecyclerView view) {         ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);         if (support != null) {             support.detach(view);         }         return support;     }      public ItemClickSupport setOnItemClickListener(OnItemClickListener listener) {         mOnItemClickListener = listener;         return this;     }      public ItemClickSupport setOnItemLongClickListener(OnItemLongClickListener listener) {         mOnItemLongClickListener = listener;         return this;     }      private void detach(RecyclerView view) {         view.removeOnChildAttachStateChangeListener(mAttachListener);         view.setTag(R.id.item_click_support, null);     }      public interface OnItemClickListener {         void onItemClicked(RecyclerView recyclerView, int position, View v);     }      public interface OnItemLongClickListener {         boolean onItemLongClicked(RecyclerView recyclerView, int position, View v);     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Java, \u0442\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 Android-\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445. \u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u043d\u0430 Kotlin \u0438 \u00ab\u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c\u00bb \u0432 RecycleView. \u041e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 Kotlin \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/extensions.html\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 onCreate \u043d\u0430\u0448\u0435\u0439 Activity \u043f\u0438\u0448\u0435\u043c: <\/p>\n<pre><code class=\"java\">        with(ItemClickSupport.addTo(rvNotesList)) {             setOnItemClickListener { recyclerView, position, v -&gt; mPresenter.openNote(this@MainActivity, position) }             setOnItemLongClickListener { recyclerView, position, v -&gt; mPresenter.showNoteContextDialog(position); true }         } <\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f <b>with<\/b> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0438\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0448\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0432 \u043d\u0435\u0435. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f Activity \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e <b>this<\/b>, \u0430 <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/this-expressions.html\">this@MainActivity<\/a>. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 this \u0432 \u0431\u043b\u043e\u043a\u0435 with, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e with. \u041f\u0440\u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u043a\u043b\u0438\u043a\u0435 \u043f\u043e \u043f\u0443\u043d\u043a\u0442\u0443 \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 Activity, \u0433\u0434\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043d\u0430\u0448\u0435\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0438. \u041f\u0440\u0438 \u0434\u043e\u043b\u0433\u043e\u043c \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043c\u0435\u043d\u044e. \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0441\u043a\u043e\u0431\u043a\u043e\u0439 \u044f \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u043b\u043e\u0432\u043e <b>return<\/b>. \u042d\u0442\u043e \u043d\u0435 \u043e\u0448\u0438\u0431\u043a\u0430, \u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u044f\u0437\u044b\u043a\u0430 Kotlin.<\/p>\n<p>  \u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043f\u0443\u043d\u043a\u0442 \u043c\u0435\u043d\u044e \u0432 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0435\u0440\u0435:<\/p>\n<pre><code class=\"java\">\/** * \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u0438\u0442\u0438 \u0441 \u0437\u0430\u043c\u0435\u0442\u043a\u043e\u0439 \u043f\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u0438 *\/ fun openNote(activity: Activity, position: Int) {     val intent = Intent(activity, NoteActivity::class.java)     intent.putExtra(&quot;note_id&quot;, mNotesList[position].id)     activity.startActivity(intent) } <\/code><\/pre>\n<p>  \u041c\u044b \u0435\u0449\u0435 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043a\u043b\u0430\u0441\u0441 NoteActivity, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443. \u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 NoteActivity \u0438\u043b\u0438 \u0432\u043e\u0432\u0441\u0435 \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 openNote. \u0417\u0430\u043f\u0438\u0441\u044c NoteActivity::class.java \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430 NoteActivity.class \u0432 Java. \u0422\u0430\u043a\u0436\u0435 \u0437\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u043c\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a ArrayList \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 get(position), \u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438, \u043a\u0430\u043a \u043a \u043e\u0431\u044b\u0447\u043d\u043e\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0443.<\/p>\n<p>  \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 MVP-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Moxy \u0432 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u044b\u043a\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 View \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437 \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435, \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0435\u0440. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c \u0438 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u044b\u043c, \u043d\u043e \u043f\u043e\u043b\u044c\u0437\u044b \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0442. \u043a. \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 Activity \u043d\u0430\u0448\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u043f\u0440\u043e\u043f\u0430\u0434\u0435\u0442.<\/p>\n<pre><code class=\"java\">\/** * \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u0437\u0430\u043c\u0435\u0442\u043a\u0438 *\/ fun showNoteContextDialog(position: Int) {     viewState.showNoteContextDialog(position) }  \/**  * \u041f\u0440\u044f\u0447\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u0437\u0430\u043c\u0435\u0442\u043a\u0438 *\/ fun hideNoteContextDialog() {     viewState.hideNoteContextDialog() } <\/code><\/pre>\n<p>  \u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u043a\u0430\u0437\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0437\u0430\u043c\u0435\u0442\u043a\u0435 \u0442. \u043a. \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439. \u041d\u043e, \u0434\u0443\u043c\u0430\u044e, \u043e\u0431\u0449\u0438\u0439 \u0441\u043c\u044b\u0441\u043b \u0432\u044b \u0443\u043b\u043e\u0432\u0438\u043b\u0438. \u0422\u0430\u043a\u0436\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434 hideNoteContextDialog \u0443 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0435\u0440\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u0437\u0430\u043a\u0440\u0432\u0442\u0438\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0430\u0437\u0430\u0434 \u0438\u043b\u0438 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u0434\u0438\u0430\u043b\u043e\u0433\u0430.<\/p>\n<p>  \u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 FAB \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0430: <\/p>\n<pre><code class=\"java\">fabButton.setOnClickListener {             mPresenter.openNewNote(this) } <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u043c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0443 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0435\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f openNewNote:<\/p>\n<pre><code class=\"java\">fun openNewNote(activity: Activity) {         val newNote = mNoteWrapper.createNote()         mNotesList.add(newNote)         sortNotesBy(getCurrentSortMethod())         openNote(activity, mNotesList.indexOf(newNote)) } <\/code><\/pre>\n<p>  \u041c\u0435\u0442\u043e\u0434 openNewNote \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u0440\u0430\u043d\u0435\u0435 openNote, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c Context \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435.<\/p>\n<p>  <\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0437\u0430\u043c\u0435\u0442\u043a\u0430\u043c<\/h3>\n<p>  <img decoding=\"async\" width=\"40%\" src=\"https:\/\/habrastorage.org\/files\/3db\/047\/107\/3db047107fe4480aa862a4325e011750.png\"\/><\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0437\u0430\u043c\u0435\u0442\u043a\u0430\u043c. \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0432 \u043f\u0430\u043f\u043a\u0435 res\/menu \u0444\u0430\u0439\u043b main.xml:<\/p>\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;menu xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;     xmlns:app=&quot;http:\/\/schemas.android.com\/apk\/res-auto&quot;&gt;      &lt;item         android:id=&quot;@+id\/action_search&quot;         android:icon=&quot;@android:drawable\/ic_menu_search&quot;         android:title=&quot;@string\/search&quot;         app:actionViewClass=&quot;android.support.v7.widget.SearchView&quot;         app:showAsAction=&quot;always&quot; \/&gt;  &lt;\/menu&gt; <\/code><\/pre>\n<p>  \u0412 MainActivity \u043f\u0438\u0448\u0435\u043c:<\/p>\n<pre><code class=\"java\">override fun onCreateOptionsMenu(menu: Menu): Boolean {     menuInflater.inflate(R.menu.main, menu)      initSearchView(menu)     return true }  private fun initSearchView(menu: Menu) {     var searchViewMenuItem = menu.findItem(R.id.action_search);     var searchView = searchViewMenuItem.actionView as SearchView;     searchView.onQueryChange { query -&gt; mPresenter.search(query) }     searchView.setOnCloseListener { mPresenter.search(&quot;&quot;); false } } <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043f\u043e\u043b\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u043f\u043e\u043b\u044f \u0432 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0435\u0440, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u0441\u043f\u0438\u0441\u043a\u0435. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0443 SearchView \u043d\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u0430 onQueryChange, \u0435\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 KAndroid.<\/p>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u0432 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0435\u0440\u0435:<\/p>\n<pre><code class=\"java\">\/** * \u0418\u0449\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 *\/ fun search(query: String) {     if (query.equals(&quot;&quot;)) {         viewState.onSearchResult(mNotesList)     } else {         val searchResults = mNotesList.filter { note -&gt; note.title!!.toLowerCase().startsWith(query.toLowerCase()) }         viewState.onSearchResult(searchResults as ArrayList&lt;Note&gt;)     } } <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043a\u0430\u043a \u043a\u0440\u0430\u0441\u0438\u0432\u043e, \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0438\u0441\u043a \u043f\u043e ArrayList \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 filter \u0438 \u043b\u044f\u043c\u0431\u0434. \u0412 Java \u0442\u043e\u0442 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0437\u0430\u043d\u044f\u043b \u0431\u044b 6-7\u0441\u0442\u0440\u043e\u043a. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430:<\/p>\n<pre><code class=\"java\">override fun onSearchResult(notes: ArrayList&lt;Note&gt;) {     rvNotesList.adapter = NotesAdapter(notes) } <\/code><\/pre>\n<p>  <\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0437\u0430\u043c\u0435\u0442\u043e\u043a<\/h3>\n<p>  \u0418 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u0442\u0430\u043f \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430, \u044d\u0442\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0437\u0430\u043c\u0435\u0442\u043e\u043a. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 res\/menu\/main.xml \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<pre><code class=\"xml\">&lt;item android:title=&quot;@string\/sort_by&quot;&gt;     &lt;menu&gt;         &lt;item             android:id=&quot;@+id\/menuSortByName&quot;             android:title=&quot;@string\/sort_by_title&quot; \/&gt;         &lt;item             android:id=&quot;@+id\/menuSortByDate&quot;             android:title=&quot;@string\/sort_by_date&quot; \/&gt;     &lt;\/menu&gt; &lt;\/item&gt; <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u043f\u0443\u043d\u043a\u0442\u044b \u043c\u0435\u043d\u044e:<\/p>\n<pre><code class=\"java\">override fun onOptionsItemSelected(item: MenuItem): Boolean {         when (item.itemId) {             R.id.menuSortByName -&gt; mPresenter.sortNotesBy(MainPresenter.SortNotesBy.NAME)             R.id.menuSortByDate -&gt; mPresenter.sortNotesBy(MainPresenter.SortNotesBy.DATE)         }     return super.onOptionsItemSelected(item) } <\/code><\/pre>\n<p>  \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <b>when <\/b>\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u043c switch-case \u0432 Java. \u041a\u043e\u0434 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432 MainPresenter:  <\/p>\n<pre><code class=\"java\">\/** * \u0421\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 *\/ fun sortNotesBy(sortMethod: SortNotesBy) {     mNotesList.sortWith(getSortComparator(sortMethod))     viewState.updateView() }  fun getSortComparator(sortMethod: SortNotesBy): Comparator&lt;Note&gt; {     when (sortMethod) {         SortNotesBy.NAME -&gt; return SortName()         SortNotesBy.DATE -&gt; return SortDate()     } } <\/code><\/pre>\n<p>  \u0410 \u0432\u043e\u0442 \u043a\u043e\u0434 \u0441\u0430\u043c\u0438\u0445 Comparator&#8217;\u043e\u0432:<\/p>\n<pre><code class=\"java\">\/**  * C\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u043f\u043e \u0434\u0430\u0442\u0435  *\/ class SortDate : Comparator&lt;Note&gt; {     override fun compare(note1: Note, note2: Note): Int {         return  note1.changeDate!!.compareTo(note2.changeDate!!)     }  }  \/**  * C\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u043f\u043e \u0438\u043c\u0435\u043d\u0438  *\/ class SortName : Comparator&lt;Note&gt; {     override fun compare(note1: Note, note2: Note): Int {         return  note1.title!!.compareTo(note2.title!!)     }  } <\/code><\/pre>\n<p>  <\/p>\n<h1>\u042d\u043a\u0440\u0430\u043d \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u043c \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/h1>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0440\u0430\u043d \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u043c \u0437\u0430\u043c\u0435\u0442\u043a\u0438. \u0417\u0434\u0435\u0441\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c\/\u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0438 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u043c\u0435\u0442\u043a\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u043c\u0435\u0442\u043a\u0435.<\/p>\n<p>  <\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0435\u043c NoteView \u0438 NotePresenter<\/h3>\n<p>  <img decoding=\"async\" width=\"40%\" src=\"https:\/\/habrastorage.org\/files\/b15\/984\/b7a\/b15984b7aa4a405fb5495ac25dc51f88.png\"\/><\/p>\n<p>  \u042d\u043a\u0440\u0430\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0442\u0440\u0438 View:<\/p>\n<p>  -\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a<br \/>  -\u0414\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f<br \/>  -\u0422\u0435\u043a\u0441\u0442 \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/p>\n<p>  \u0410 \u0432\u043e\u0442 \u0438 \u0441\u0430\u043c\u0430 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0430:<\/p>\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;LinearLayout xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;     android:layout_width=&quot;match_parent&quot;     android:layout_height=&quot;match_parent&quot;     android:orientation=&quot;vertical&quot;&gt;       &lt;EditText         android:id=&quot;@+id\/etTitle&quot;         android:layout_width=&quot;match_parent&quot;         android:layout_height=&quot;wrap_content&quot;         android:singleLine=&quot;true&quot;         android:background=&quot;#EEEEEE&quot;         android:textColor=&quot;#212121&quot;         android:paddingLeft=&quot;10dp&quot;         android:paddingTop=&quot;10dp&quot;         android:paddingBottom=&quot;5dp&quot;         android:hint=&quot;\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a&quot;         \/&gt;      &lt;TextView         android:id=&quot;@+id\/tvNoteDate&quot;         android:layout_width=&quot;match_parent&quot;         android:layout_height=&quot;wrap_content&quot;         android:singleLine=&quot;true&quot;         android:background=&quot;#EEEEEE&quot;         android:textColor=&quot;#212121&quot;         android:paddingLeft=&quot;10dp&quot;         android:paddingBottom=&quot;10dp&quot;         \/&gt;      &lt;EditText         android:id=&quot;@+id\/etText&quot;         android:layout_width=&quot;match_parent&quot;         android:layout_height=&quot;match_parent&quot;         android:textColor=&quot;#000000&quot;         android:gravity=&quot;start&quot;         android:hint=&quot;\u0422\u0435\u043a\u0441\u0442&quot;         android:background=&quot;@null&quot;         android:paddingLeft=&quot;10dp&quot;         \/&gt;  &lt;\/LinearLayout&gt; <\/code><\/pre>\n<p>  \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043c\u0435\u043b\u044c\u043a\u043e\u043c \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b \u043e\u0431 Anko. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043a\u043e\u0434, \u043d\u0435 \u0442\u0435\u0440\u044f\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432 \u0443\u0434\u043e\u0431\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438. \u0412\u043e\u0442 \u0442\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0431\u044b \u043d\u0430\u0448\u0430 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0430 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 Anko:<\/p>\n<pre><code class=\"java\">class MyActivity : AppCompatActivity() {     override fun onCreate(savedInstanceState: Bundle?) {         super.onCreate(savedInstanceState)         MyActivityUI().setContentView(this)     } }  class MyActivityUI : AnkoComponent {      companion object {         val ET_TITLE_ID = View.generateViewId()         val TV_NOTE_DATE_ID = View.generateViewId()         val ET_TEXT_ID = View.generateViewId()     }          override fun createView(ui: AnkoContext&lt;MainActivit&gt;) = with(ui) {         verticalLayout {              editText {                  id = ET_TITLE_ID                 singleLine = true                 backgroundColor = 0xEE.gray.opaque                 textColor = 0x21.gray.opaque                 leftPadding = dip(10)                 topPadding = dip(10)                 bottomPadding = dip(5)                 hint = &quot;\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a&quot;             }.lparams(matchParent, wrapContent)                          textView {                 id = TV_NOTE_DATE_ID                 singleLine = true                 backgroundColor = 0xEE.gray.opaque                 textColor = 0x21.gray.opaque                 leftPadding = dip(10)                 bottomPadding = dip(10)             }.lparams(matchParent, wrapContent)                          editText {                  id = ET_TEXT_ID                 textColor = Color.BLACK                 gravity = Gravity.START                 hint = &quot;\u0422\u0435\u043a\u0441\u0442&quot;                 background = null                 leftPadding = dip(10)             }         }     } } <\/code><\/pre>\n<p>  \u041d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u0442\u044c\u0441\u044f \u0438 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043a\u043e\u0434\u0430. \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c View:<\/p>\n<pre><code class=\"java\">interface NoteView : MvpView {      fun showNote(note: Note)      fun onNoteSaved()      fun onNoteDeleted()      fun showNoteInfoDialog(noteInfo: String)      fun hideNoteInfoDialog()      fun showNoteDeleteDialog()      fun hideNoteDeleteDialog()  } <\/code><\/pre>\n<p>  \u0418\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c NoteView \u0432 NoteActivity:<\/p>\n<pre><code class=\"java\">class NoteActivity : MvpAppCompatActivity(), NoteView {      @InjectPresenter     lateinit var mPresenter: NotePresenter      override fun onCreate(savedInstanceState: Bundle?) {         super.onCreate(savedInstanceState)         setContentView(R.layout.activity_note)          val noteId = intent.extras.getLong(&quot;note_id&quot;, -1)         mPresenter.showNote(noteId)     }  } <\/code><\/pre>\n<p>  \u0412 onCreate \u043c\u044b \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c id \u0437\u0430\u043c\u0435\u0442\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0435\u0440 \u0434\u043e\u0441\u0442\u0430\u043b \u0437\u0430\u043c\u0435\u0442\u043a\u0443 \u0438\u0437 \u0411\u0414 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043b \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043e View. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0435\u0440:<\/p>\n<pre><code class=\"java\">@InjectViewState class NotePresenter : MvpPresenter&lt;NoteView&gt; {      @Inject     lateinit var mNoteWrapper: NoteWrapper     lateinit var mNote: Note      constructor() : super() {         NotelinApplication.graph.inject(this)     }      fun showNote(noteId: Long) {         mNote = mNoteWrapper.getNoteById(noteId)         viewState.showNote(mNote)     }  } <\/code><\/pre>\n<p>  \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043a\u043b\u0430\u0441\u0441 AppComponent \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<pre><code class=\"java\">fun inject(notePresenter: NotePresenter) <\/code><\/pre>\n<p>  \u041f\u043e\u043a\u0430\u0436\u0435\u043c \u043d\u0430\u0448\u0443 \u0437\u0430\u043c\u0435\u0442\u043a\u0443:<\/p>\n<pre><code class=\"java\">override fun showNote(note: Note) {     tvNoteDate.text = DateUtils.formatDate(note.changeDate)     etTitle.setText(note.title)     etText.setText(note.text) } <\/code><\/pre>\n<p>  <\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/h3>\n<p>  \u0414\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u0443\u043d\u043a\u0442 \u0432 \u043c\u0435\u043d\u044e. \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0444\u0430\u0439\u043b <b>res\/menu\/note.xml<\/b>:<\/p>\n<pre><code class=\"java\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;menu xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;     xmlns:app=&quot;http:\/\/schemas.android.com\/apk\/res-auto&quot;     &gt;     &lt;item         android:id=&quot;@+id\/menuSaveNote&quot;         android:title=&quot;@string\/save&quot;         app:showAsAction=&quot;never&quot;         \/&gt; &lt;\/menu&gt; <\/code><\/pre>\n<pre><code class=\"java\">override fun onCreateOptionsMenu(menu: Menu): Boolean {     menuInflater.inflate(R.menu.note, menu)     return true }  \u041f\u043e\u043a\u0430\u0436\u0435\u043c \u043c\u0435\u043d\u044e \u0432 Activity:  override fun onOptionsItemSelected(item: MenuItem): Boolean {     when (item.itemId) {         R.id.menuSaveNote -&gt; mPresenter.saveNote(etTitle.text.toString(), etText.text.toString())     }     return super.onOptionsItemSelected(item) } <\/code><\/pre>\n<p>  \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u044f \u043d\u0435 \u0441\u0442\u0430\u043b \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a\u043e\u0434 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0432\u043e\u0434\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0437\u0430\u043c\u0435\u0442\u043a\u0435. \u041f\u0440\u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u044f \u043f\u0435\u0440\u0435\u0434\u0430\u043b \u0432 NoteActivity \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0437\u0430\u043c\u0435\u0442\u043a\u0435 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0437\u0430\u043c\u0435\u0442\u043a\u0438, \u043e\u043d\u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u0434\u0430\u043b\u044f\u043b\u0430\u0441\u044c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430. \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b EventBus. \u0418 \u043e\u043f\u044f\u0442\u044c, \u044f \u043d\u0435 \u0441\u0442\u0430\u043b \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a\u043e\u0434.<\/p>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0435: \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f, \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0438 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f. \u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0437\u0430\u043c\u0435\u0442\u043e\u043a. \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043f\u043e\u043b\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434, \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043f\u0440\u0438\u0432\u0435\u043b \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u0447\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u0432\u0441\u0435 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e.<\/p>\n<p>  <\/p>\n<h1>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u0438<\/h1>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0435\u043b\u044c\u0437\u044f \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u043e \u043b\u044e\u0434\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u043b\u0438 \u043c\u043d\u0435 \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0441\u0442\u0430\u0442\u044c\u0438. \u0425\u043e\u0442\u0435\u043b \u0431\u044b \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0445\u0430\u0431\u0440\u0430\u044e\u0437\u0435\u0440\u0430\u043c \u042e\u0440\u0438\u044e \u0428\u043c\u0430\u043a\u043e\u0432\u0443 (@senneco) \u0437\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0441 \u0435\u0433\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 Moxy \u0438 \u0437\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u043e \u0434\u0440\u0443\u0433\u0438\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c. \u0422\u0430\u043a\u0436\u0435, \u0445\u043e\u0447\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0430c\u0438\u0431\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0443 JetBrains \u0420\u043e\u043c\u0430\u043d\u0443 \u0411\u0435\u043b\u043e\u0432\u0443 (@belovrv) \u0437\u0430 \u0440\u0435\u0432\u044c\u044e \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u0437\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 Anko.<\/p>\n<p>  <\/p>\n<h1>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h1>\n<p>  \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0441\u043c\u043e\u0433\u043b\u0430 \u0443\u0431\u0435\u0434\u0438\u0442\u044c \u0432\u0430\u0441 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Kotlin \u043d\u0435 \u0442\u0440\u0443\u0434\u043d\u043e, \u0430 \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0436\u0435 \u0438 \u043b\u0435\u0433\u0447\u0435, \u0447\u0435\u043c \u043d\u0430 Java. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043c\u043e\u0433\u0443\u0442 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0442\u044c\u0441\u044f \u0438 \u0431\u0430\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0438 JetBrains \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0444\u0438\u043a\u0441\u044f\u0442. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0438\u0445 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043d\u0430 <a href=\"https:\/\/kotlinlang.slack.com\/\">Slack-\u043a\u0430\u043d\u0430\u043b\u0435<\/a>. \u0422\u0430\u043a\u0436\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0430 Kotlin <a href=\"http:\/\/java-help.ru\/category\/android-kotlin\/\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430: <a href=\"https:\/\/github.com\/ImangazalievM\/Notelin\">Notelin<\/a>.        \t<\/p>\n<div class=\"polling\">\n<form action=\"\/json\/polling\/\" class=\"poll\" method=\"post\">\n<div class=\"poll_title\">\u0410 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 Kotlin \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445?<\/div>\n<p>  \t\t<input type=\"hidden\" name=\"post_id\" value=\"275255\"\/> \t\t<input type=\"hidden\" name=\"polling_question_id\" value=\"14939\"\/>  \t\t<\/p>\n<table class=\"answer\">\n<tr>\n<td class=\"input\"> \t\t\t\t\t<input type=\"radio\" id=\"vv72903\" \t\t\t\t\t\tclass=\"radio js-field-data\" \t\t\t\t\t\tname=\"variant[]\" \t\t\t\t\t\tvalue=\"72903\" \/> \t\t\t\t<\/td>\n<td class=\"label\"> \t\t\t\t\t<label for=\"vv72903\">\u0414\u0430<\/label> \t\t\t\t<\/td>\n<\/tr>\n<tr>\n<td class=\"input\"> \t\t\t\t\t<input type=\"radio\" id=\"vv72905\" \t\t\t\t\t\tclass=\"radio js-field-data\" \t\t\t\t\t\tname=\"variant[]\" \t\t\t\t\t\tvalue=\"72905\" \/> \t\t\t\t<\/td>\n<td class=\"label\"> \t\t\t\t\t<label for=\"vv72905\">\u041d\u0435\u0442, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0447\u043d\u0443<\/label> \t\t\t\t<\/td>\n<\/tr>\n<tr>\n<td class=\"input\"> \t\t\t\t\t<input type=\"radio\" id=\"vv72907\" \t\t\t\t\t\tclass=\"radio js-field-data\" \t\t\t\t\t\tname=\"variant[]\" \t\t\t\t\t\tvalue=\"72907\" \/> \t\t\t\t<\/td>\n<td class=\"label\"> \t\t\t\t\t<label for=\"vv72907\">\u041d\u0435\u0442, \u0438 \u043d\u0435 \u0431\u0443\u0434\u0443<\/label> \t\t\t\t<\/td>\n<\/tr>\n<\/table>\n<p class=\"total\">\u041d\u0438\u043a\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b. \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u043d\u0435\u0442.<\/p>\n<\/p><\/form>\n<p class=\"for_users_only_msg\">\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a href=\"https:\/\/habrahabr.ru\/auth\/login\/\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/p>\n<\/p><\/div>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/275255\/\"> https:\/\/habrahabr.ru\/post\/275255\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/ad1\/e16\/e49\/ad1e16e4935a4ca487ccd75f7aa277fe.png\"\/><\/div>\n<p>  \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Kotlin \u043f\u043e\u0434 Android \u043d\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u0441\u0440\u0435\u0434\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043e\u0434\u043d\u0430\u043a\u043e \u0441\u0442\u0430\u0442\u0435\u0439 \u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u043e. \u042f \u0440\u0435\u0448\u0438\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Kotlin. \u041c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u0441\u0435\u0445 \u0442\u0440\u0435\u043d\u0434\u043e\u0432\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a (\u043a\u0440\u043e\u043c\u0435 RxJava) \u0432 \u043c\u0438\u0440\u0435 Android-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0443 \u043d\u0430\u0441 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u043e\u0435 \u0438 \u043b\u0435\u0433\u043a\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (\u0441\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u044b \u043c\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c).<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-279131","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/279131","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=279131"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/279131\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=279131"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=279131"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=279131"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}