- kotlin coroutines
- LiveData
- https://fernandocejas.com/2018/05/07/architecting-android-reloaded/
- https://developer.android.com/jetpack/docs/guide
- https://developer.android.com/topic/libraries/architecture/livedata
- https://github.com/googlesamples/android-architecture-components/blob/88747993139224a4bb6dbe985adf652d557de621/GithubBrowserSample/app/src/main/java/com/android/example/github/repository/NetworkBoundResource.kt
- https://github.com/bufferapp/android-clean-architecture-boilerplate
Independence of UI and datasource (database or api)
- https://developer.android.com/jetpack/docs/guide
- https://developer.android.com/jetpack/arch/
- https://developer.android.com/topic/libraries/architecture/
- https://developer.android.com/jetpack/docs/getting-started - incomplete documentation
- Sunflower app - alpha release, still in development
- https://github.com/googlesamples/android-architecture-components/blob/master/README.md
- https://developer.android.com/guide/components/fundamentals
- https://developer.android.com/training/basics/firstapp/
- https://codelabs.developers.google.com/?cat=Android
- https://codelabs.developers.google.com/codelabs/android-room-with-a-view-kotlin/#0
- The Google I/O 2018 Android App
- Kotlin android samples
- https://www.one-tab.com/page/dCawsLBBQEG3t9vrjTTJ0A
- https://www.one-tab.com/page/H95FKwbQRXuEGnlZ47xgSg
- https://www.one-tab.com/page/1NSsugqSTrWzYpGQ85smYA
- https://www.one-tab.com/page/5fDICQdKQXKFzQCCVBrt8Q
- https://www.one-tab.com/page/BL-Nz1K2Su-OLJn5mu6sgA
- https://www.one-tab.com/page/XrDYZ-K9RWSYP57QLxGolg
- https://www.one-tab.com/page/VaXML15ZSH6txb1fPt2RUQ
- https://www.one-tab.com/page/n_dYvI8DQNGjDge_Zls_Yw
- https://www.one-tab.com/page/uIW0uY5iQnmou0k7uqyjlw
- https://www.one-tab.com/page/upkO43IZTiypZ-LISQPvBg
- https://www.one-tab.com/page/QwuwcJ3GSvGlqtA-_o87LA
- https://www.one-tab.com/page/WlLikv0-TQGm4kWvip0W7Q
- https://www.one-tab.com/page/O0AWejSKSJuD2C_l3fYZKg
- https://www.one-tab.com/page/4lkWty7tQa6tYAxkCx6n4g
- https://www.one-tab.com/page/qkc0bDyzSZGKzuIvEI1_hg
- https://www.one-tab.com/page/GnhvVXSzT72oR-ekMWLFXQ
- https://www.one-tab.com/page/U6hjkqyNRSKUlnIz2SNuCA
- https://www.one-tab.com/page/_-YTyq8YSbqmFtB2O8X9qA
- https://www.one-tab.com/page/lg6c4nurQvK78rKHdDZwMQ
- https://www.one-tab.com/page/lg6c4nurQvK78rKHdDZwMQ
- https://www.one-tab.com/page/F1ii5GxzSTakt1ewgQSSyA
- https://www.one-tab.com/page/kDBgJyhsQgumQI_Ak8TR4g
- https://www.one-tab.com/page/gkr2uswHQ--6DWCO-xw84A
- https://www.one-tab.com/page/EyqDriw0SOWodYBh2uHwCg
- https://www.one-tab.com/page/0XCo2cWlStuNPJyq10S3zA
- https://www.one-tab.com/page/uXFBTn6mRDG_Et0niCZ6Zg
- https://www.one-tab.com/page/TDfNLqRPSLu9G6Z_M4Pp5w
- https://hadihariri.com/2014/01/06/intellij-idea-minimal-survival-guide/
- https://hadihariri.com/2013/12/29/jvm-minimal-survival-guide-for-the-dotnet-developer/
- https://kotlinlang.org/docs/reference/basic-syntax.html
- https://github.com/yelp/kotlin-android-workshop
- https://developer.android.com/kotlin/
- https://www.youtube.com/playlist?list=PLpg00ti3ApRweIhdOI4VCFFStx4uXC__u
- https://android.jlelse.eu/learn-kotlin-while-developing-an-android-app-introduction-567e21ff9664
- https://superkotlin.com/resources-learn-kotlin/
- http://libgen.io/book/index.php?md5=FBE6BA595EC371A42AF292DF4ACCEDB9
- https://exercism.io/
- https://www.one-tab.com/page/YsI_WVfySjmfgN40eprpQg
- keyboard shortcuts
- https://plugins.jetbrains.com/plugin/9792-key-promoter-x
- https://plugins.jetbrains.com/plugin/7275-codeglance
- Rainbow brackets
- https://angrynerds.pl/blog/top-12-plugins-for-android-studio/
- https://blog.aritraroy.in/30-kickass-tools-to-develop-android-apps-like-a-pro-191e52b9419b
var can be assigned to multiple times, whereas val can be initialized or assigned to only once.
The @={} notation, which importantly includes the "=" sign, receives data changes to the property and listen to user updates at the same time.
If you create a binding adapter for a LiveData property in your viewModel, you do not need to give the binding adapter the LiveData type, just the inner type. Eg:
Fragment
@BindingAdapter(value =["searchResults"])
fun setArchiveTextVisibility(textView: TextView, searchResults: PagedList<StorySummary>?){
textView.visibility = if(searchResults.isNullOrEmpty()) View.VISIBLE else View.GONE
}
Viewmodel
val searchResults: LiveData<PagedList<StorySummary>>
fragment_search.xml
<TextView
app:searchResults="@{viewModel.searchResults}"
/>
Packages group related classes. Packages are declared with the package keyword, and any Kotlin file with a package declaration at the beginning can contain declarations of classes, functions, or interfaces. (Equivalent of C# namespaces)