Skip to content

Instantly share code, notes, and snippets.

View fvilarino's full-sized avatar

Francesc Vilariño Güell fvilarino

View GitHub Profile
@fvilarino
fvilarino / forecast_viewholders.kt
Created April 19, 2021 21:07
Forecast ViewHolders
class ForecastHeaderViewHolder(
binding: ViewholderForecastHeaderBinding
) : RecyclerViewViewHolder<ForecastHeaderBindingItem>(binding) {
override fun bind(bindingItem: ForecastHeaderBindingItem) {
(binding as ViewholderForecastHeaderBinding).state = bindingItem.forecastHeaderState
binding.executePendingBindings()
}
}
@fvilarino
fvilarino / forecast_state.kt
Created April 19, 2021 21:13
Forecast State Classes
data class ForecastHeaderState(
override val id: Long,
val date: CharSequence,
val sunrise: CharSequence,
val sunset: CharSequence,
) : Diffable
data class ForecastCardState(
override val id: Long,
val header: CharSequence,
@fvilarino
fvilarino / forecast_fragment.xml
Created April 19, 2021 21:15
Forecast Fragment Layout
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:bind="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="state"
@fvilarino
fvilarino / forecast_fragment.kt
Created April 19, 2021 21:18
Forecast Fragment
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentForecastBinding.inflate(inflater, container, false)
binding.lifecycleOwner = this
return binding.root
}
@fvilarino
fvilarino / compose_forecast_header.kt
Created April 19, 2021 21:23
Compose Forecast Header
fun ForecastHeader(
state: ForecastItem.ForecastHeader,
modifier: Modifier = Modifier,
) {
Column(
modifier = modifier,
horizontalAlignment = Alignment.CenterHorizontally,
) {
Text(
@fvilarino
fvilarino / compose_forecast_card.kt
Created April 19, 2021 21:27
Compose Forecast Card
@Composable
fun ForecastWeatherCard(
state: ForecastItem.ForecastCard,
modifier: Modifier = Modifier,
elevation: Dp = CardElevation,
) {
Card(modifier = modifier, elevation = elevation) {
Column(modifier = Modifier.fillMaxWidth().padding(MarginSingle)) {
Row(verticalAlignment = Alignment.CenterVertically) {
Icon(
@fvilarino
fvilarino / compose_forecast_list.kt
Created April 19, 2021 21:36
Compose Forecast List
LazyColumn(
modifier = Modifier.fillMaxWidth().padding(bottom = MarginSingle),
verticalArrangement = Arrangement.spacedBy(MarginSingle),
horizontalAlignment = Alignment.CenterHorizontally
) {
items(state.forecastItems) { item ->
when (item) {
is ForecastItem.ForecastHeader -> ForecastHeader(
state = item,
modifier = Modifier.fillMaxWidth(.85f),
@fvilarino
fvilarino / compose_state_classes.kt
Created April 19, 2021 21:38
Compose State Classes
sealed class ForecastItem {
data class ForecastHeader(
val id: Long,
val date: String,
val sunrise: String,
val sunset: String,
) : ForecastItem()
data class ForecastCard(
val id: Long,
@fvilarino
fvilarino / view_system_viewmodel_observer.kt
Last active April 20, 2021 19:14
View System Viewmodel Observer
@HiltViewModel
class CityViewModel @Inject constructor() : ViewModel(), DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
// fragment is now started, run tasks
}
override fun onStop(owner: LifecycleOwner) {
// fragment is now stopped, cancel running tasks
}
@fvilarino
fvilarino / compose_viewmodel_lifecycle_observer.kt
Last active May 25, 2021 20:51
Compose ViewModel LIfecycle
@HiltViewModel
class CityViewModel @Inject constructor() : ViewModel() {
fun onStart() {
// start task - the composable has entered the composition
}
fun onStop() {
// cancel task - the composable has left the composition
}