Skip to content

Commit 7ca6a36

Browse files
committed
7 days weather forecast
1 parent 7cf0c07 commit 7ca6a36

File tree

13 files changed

+313
-36
lines changed

13 files changed

+313
-36
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
android:supportsRtl="true"
1515
android:theme="@style/Theme.WeatherApp"
1616
tools:targetApi="31">
17+
<activity
18+
android:name=".activity.WeatherForecastActivity"
19+
android:exported="false" />
1720
<activity
1821
android:name=".activity.CitySearchActivity"
1922
android:exported="false" />

app/src/main/java/rahulstech/android/weatherapp/activity/HomeActivity.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.os.Bundle
55
import android.util.Log
66
import android.view.Menu
77
import android.view.MenuItem
8+
import android.widget.Button
89
import android.widget.ImageView
910
import android.widget.TextView
1011
import androidx.appcompat.app.AppCompatActivity
@@ -59,6 +60,8 @@ class HomeActivity : AppCompatActivity() {
5960

6061
private lateinit var forecastHourly: RecyclerView
6162

63+
private lateinit var btnWeatherForecast: Button
64+
6265
private lateinit var hourlyForecastAdapter: HourlyForecastAdapter
6366

6467
override fun onCreate(savedInstanceState: Bundle?) {
@@ -77,6 +80,8 @@ class HomeActivity : AppCompatActivity() {
7780
otherTemp = findViewById(R.id.other_temp)
7881
dateTime = findViewById(R.id.dateTime)
7982
forecastHourly = findViewById(R.id.forecast_hourly)
83+
btnWeatherForecast = findViewById(R.id.btn_weather_forecast)
84+
btnWeatherForecast.setOnClickListener { handleWeatherForecastButton() }
8085

8186
val layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
8287
hourlyForecastAdapter = HourlyForecastAdapter(this)
@@ -88,6 +93,10 @@ class HomeActivity : AppCompatActivity() {
8893
viewModel.weatherToday.observe(this) { onCurrentWeatherReportFetched(it) }
8994
}
9095

96+
private fun handleWeatherForecastButton() {
97+
startActivity(Intent(this, WeatherForecastActivity::class.java))
98+
}
99+
91100
override fun onStart() {
92101
super.onStart()
93102

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package rahulstech.android.weatherapp.activity
2+
3+
import android.os.Bundle
4+
import android.util.Log
5+
import androidx.appcompat.app.AppCompatActivity
6+
import androidx.lifecycle.ViewModelProvider
7+
import androidx.recyclerview.widget.LinearLayoutManager
8+
import androidx.recyclerview.widget.RecyclerView
9+
import rahulstech.android.weatherapp.R
10+
import rahulstech.android.weatherapp.adapter.WeatherForecastAdapter
11+
import rahulstech.android.weatherapp.setting.SettingsStorage
12+
import rahulstech.android.weatherapp.viewmodel.HomeViewModel
13+
import rahulstech.weather.repository.WeatherForecast
14+
15+
class WeatherForecastActivity : AppCompatActivity() {
16+
17+
private val TAG = WeatherForecastActivity::class.java.simpleName
18+
19+
private lateinit var forecasts: RecyclerView
20+
21+
private lateinit var weatherForecastAdapter: WeatherForecastAdapter
22+
23+
private lateinit var viewModel: HomeViewModel
24+
25+
override fun onCreate(savedInstanceState: Bundle?) {
26+
super.onCreate(savedInstanceState)
27+
setContentView(R.layout.activity_weather_forecast)
28+
29+
forecasts = findViewById(R.id.forecasts)
30+
31+
val layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
32+
forecasts.layoutManager = layoutManager
33+
34+
weatherForecastAdapter = WeatherForecastAdapter(this)
35+
forecasts.adapter = weatherForecastAdapter
36+
37+
viewModel = ViewModelProvider(this).get(HomeViewModel::class.java)
38+
viewModel.sevenDaysWeatherForecast.observe(this) { onForecastFetched(it) }
39+
}
40+
41+
private fun onForecastFetched(data: List<WeatherForecast>?) {
42+
if (!data.isNullOrEmpty()) {
43+
val city = data[0].city
44+
this.title = "${city.name}, ${city.region}"
45+
}
46+
Log.i(TAG, "no. of forecasts ${data?.size}")
47+
weatherForecastAdapter.submitList(data)
48+
}
49+
50+
override fun onStart() {
51+
super.onStart()
52+
53+
val weatherLocationId = SettingsStorage.get(this).getWeatherLocationId()
54+
viewModel.setLocationId(weatherLocationId)
55+
}
56+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package rahulstech.android.weatherapp.adapter
2+
3+
import android.content.Context
4+
import android.util.Log
5+
import android.view.LayoutInflater
6+
import android.view.View
7+
import android.view.ViewGroup
8+
import android.widget.ImageView
9+
import android.widget.TextView
10+
import androidx.recyclerview.widget.DiffUtil
11+
import androidx.recyclerview.widget.ListAdapter
12+
import androidx.recyclerview.widget.RecyclerView
13+
import rahulstech.android.weatherapp.BuildConfig
14+
import rahulstech.android.weatherapp.R
15+
import rahulstech.android.weatherapp.getWeatherConditionIcon
16+
import rahulstech.android.weatherapp.getWeatherConditionText
17+
import rahulstech.weather.repository.WeatherForecast
18+
import java.time.format.DateTimeFormatter
19+
20+
private val FORMAT_FORECAST_DAY = DateTimeFormatter.ofPattern("EEEE, dd MMM")
21+
22+
class WeatherForecastViewHolder(view: View) : RecyclerView.ViewHolder(view) {
23+
24+
private val context = view.context
25+
private val iconWeatherCondition: ImageView = view.findViewById(R.id.icon_weather_condition)
26+
private val labelWeatherCondition: TextView = view.findViewById(R.id.label_weather_condition)
27+
private val labelDate: TextView = view.findViewById(R.id.label_date)
28+
private val labelTemp: TextView = view.findViewById(R.id.label_temperature)
29+
private val labelPrecip: TextView = view.findViewById(R.id.label_precipitation)
30+
31+
fun bind(data: WeatherForecast?) {
32+
if (null == data) {
33+
iconWeatherCondition.setImageDrawable(null)
34+
labelWeatherCondition.text = null
35+
labelDate.text = null
36+
labelTemp.text = null
37+
labelPrecip.text = null
38+
}
39+
else {
40+
val day = data.day
41+
val condition = day.condition
42+
43+
iconWeatherCondition.setImageDrawable(getWeatherConditionIcon(context, condition, true))
44+
labelWeatherCondition.text = getWeatherConditionText(context, condition, true)
45+
labelDate.text = day.date.format(FORMAT_FORECAST_DAY)
46+
labelTemp.text = context.getString(R.string.text_forecast_temp_c, day.maxTemp, day.minTemp)
47+
labelPrecip.text = context.getString(R.string.text_forecast_precipitation, day.totalPrecipitation)
48+
}
49+
}
50+
}
51+
52+
private val weatherForecastItemCallback = object : DiffUtil.ItemCallback<WeatherForecast>() {
53+
override fun areItemsTheSame(oldItem: WeatherForecast, newItem: WeatherForecast): Boolean {
54+
return oldItem.city.locationId == newItem.city.locationId
55+
&& oldItem.day.date.isEqual(newItem.day.date)
56+
}
57+
58+
override fun areContentsTheSame(oldItem: WeatherForecast, newItem: WeatherForecast): Boolean =
59+
oldItem == newItem
60+
61+
}
62+
63+
class WeatherForecastAdapter(context: Context) :
64+
ListAdapter<WeatherForecast, WeatherForecastViewHolder>(weatherForecastItemCallback) {
65+
66+
private val TAG = WeatherForecastAdapter::class.java.simpleName
67+
68+
private val inflate = LayoutInflater.from(context)
69+
70+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WeatherForecastViewHolder {
71+
val view = inflate.inflate(R.layout.item_daily_weather_forecast, parent, false)
72+
return WeatherForecastViewHolder(view)
73+
}
74+
75+
override fun onBindViewHolder(holder: WeatherForecastViewHolder, position: Int) {
76+
val item = getItem(position)
77+
if (BuildConfig.DEBUG) {
78+
Log.d(TAG, "binding forecast $item")
79+
}
80+
holder.bind(item)
81+
}
82+
}

app/src/main/java/rahulstech/android/weatherapp/viewmodel/HomeViewModel.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ class HomeViewModel(application: Application) : AndroidViewModel(application) {
1919
repository.getWeatherToday(it)
2020
}
2121

22+
val sevenDaysWeatherForecast: LiveData<List<WeatherForecast>?> = locationIdLiveData.switchMap {
23+
repository.getWeatherForecast(it, 7)
24+
}
25+
2226
fun setLocationId(locationId: String) {
2327
locationIdLiveData.value = locationId
2428
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:viewportHeight="512" android:viewportWidth="512" android:width="24dp">
2+
3+
<path android:fillColor="#F0EFEF" android:pathData="M300.73,96C310.44,104.22 317.41,115.47 320,128C320.08,129.97 320.11,131.93 320.1,133.9C320.09,135.11 320.09,136.31 320.09,137.56C320.08,138.89 320.07,140.23 320.06,141.56C320.06,142.97 320.05,144.38 320.05,145.79C320.04,148.82 320.03,151.85 320.02,154.88C320,159.67 320,164.47 320,169.26C320,170.07 320,170.88 320,171.72C320,174.21 320,176.7 320,179.2C320.01,189.52 320.01,199.84 319.95,210.17C319.91,217.7 319.9,225.23 319.92,232.76C319.94,236.75 319.94,240.73 319.89,244.71C319.86,248.46 319.86,252.21 319.89,255.96C319.9,257.98 319.87,260.01 319.83,262.04C319.82,268.69 319.82,268.69 322.96,274.31C325.23,276.08 327.52,277.54 330,279C348.55,294.65 360.32,316.85 363,341C364.79,371.86 356.68,396.69 336.17,420.09C321.73,435.43 299.06,446.96 277.93,448.18C246.43,448.77 221.77,443.05 198,421C179.82,402.74 170.06,378.44 169.69,352.75C169.81,324.22 181.75,300.14 201.57,280.17C204,278 204,278 205.95,276.95C208.43,275.51 210.15,274.2 212,272C213.19,267.51 213.03,263.12 212.94,258.51C212.94,257.13 212.94,255.75 212.95,254.37C212.96,251.41 212.94,248.46 212.91,245.5C212.85,240.8 212.85,236.11 212.86,231.42C212.87,223.98 212.84,216.55 212.8,209.12C212.71,195.84 212.68,182.56 212.68,169.28C212.68,164.62 212.66,159.97 212.62,155.32C212.59,152.41 212.59,149.5 212.59,146.58C212.58,144.62 212.55,142.65 212.53,140.69C212.56,124.7 217.65,112.07 228,100C248.76,81.49 278.08,79.4 300.73,96Z"/>
4+
5+
<path android:fillColor="#1B1B1B" android:pathData="M300.73,96C310.44,104.22 317.41,115.47 320,128C320.08,129.97 320.11,131.93 320.1,133.9C320.09,135.11 320.09,136.31 320.09,137.56C320.08,138.89 320.07,140.23 320.06,141.56C320.06,142.97 320.05,144.38 320.05,145.79C320.04,148.82 320.03,151.85 320.02,154.88C320,159.67 320,164.47 320,169.26C320,170.07 320,170.88 320,171.72C320,174.21 320,176.7 320,179.2C320.01,189.52 320.01,199.84 319.95,210.17C319.91,217.7 319.9,225.23 319.92,232.76C319.94,236.75 319.94,240.73 319.89,244.71C319.86,248.46 319.86,252.21 319.89,255.96C319.9,257.98 319.87,260.01 319.83,262.04C319.82,268.69 319.82,268.69 322.96,274.31C325.23,276.08 327.52,277.54 330,279C348.55,294.65 360.32,316.85 363,341C364.79,371.86 356.68,396.69 336.17,420.09C321.73,435.43 299.06,446.96 277.93,448.18C246.43,448.77 221.77,443.05 198,421C179.82,402.74 170.06,378.44 169.69,352.75C169.81,324.22 181.75,300.14 201.57,280.17C204,278 204,278 205.95,276.95C208.43,275.51 210.15,274.2 212,272C213.19,267.51 213.03,263.12 212.94,258.51C212.94,257.13 212.94,255.75 212.95,254.37C212.96,251.41 212.94,248.46 212.91,245.5C212.85,240.8 212.85,236.11 212.86,231.42C212.87,223.98 212.84,216.55 212.8,209.12C212.71,195.84 212.68,182.56 212.68,169.28C212.68,164.62 212.66,159.97 212.62,155.32C212.59,152.41 212.59,149.5 212.59,146.58C212.58,144.62 212.55,142.65 212.53,140.69C212.56,124.7 217.65,112.07 228,100C248.76,81.49 278.08,79.4 300.73,96ZM240.46,119.8C236.33,125.26 234.75,130.49 234.75,137.38C234.74,139.27 234.74,139.27 234.73,141.2C234.74,142.58 234.74,143.97 234.74,145.36C234.74,146.82 234.74,148.29 234.73,149.76C234.73,152.92 234.72,156.07 234.73,159.23C234.73,164.22 234.71,169.22 234.7,174.21C234.65,188.4 234.63,202.6 234.62,216.79C234.62,224.63 234.6,232.48 234.56,240.32C234.54,245.29 234.54,250.25 234.55,255.21C234.55,258.3 234.54,261.38 234.52,264.47C234.52,265.9 234.52,267.33 234.53,268.76C234.6,282.2 234.6,282.2 230,287C227.59,288.73 227.59,288.73 224.94,290.19C214.44,296.57 206.94,305.35 201,316C200.54,316.79 200.08,317.58 199.61,318.39C191.37,333.44 189.34,351.79 193.19,368.5C193.75,370.35 194.36,372.18 195,374C195.34,375.05 195.68,376.1 196.03,377.19C202.65,396.15 216.08,410.35 233.78,419.43C244.25,424.41 253.33,426.48 264.94,426.31C266.04,426.32 267.14,426.32 268.28,426.32C280.94,426.24 290.76,423.84 302,418C302.88,417.55 303.76,417.09 304.66,416.63C322.6,406.62 332.98,390.3 339.42,371.27C344.36,351.9 341.4,330.68 331.34,313.55C324.63,302.92 314.66,293.26 303.66,287.24C301.54,285.66 300.97,284.46 300,282C299.75,279.21 299.75,279.21 299.76,275.94C299.75,274.7 299.75,273.46 299.74,272.18C299.75,270.81 299.75,269.43 299.76,268.06C299.76,266.61 299.76,265.16 299.75,263.71C299.75,260.59 299.75,257.47 299.76,254.35C299.76,249.41 299.75,244.46 299.74,239.52C299.7,225.46 299.68,211.4 299.69,197.35C299.7,189.58 299.69,181.82 299.66,174.05C299.64,169.15 299.64,164.24 299.66,159.34C299.67,156.27 299.66,153.21 299.64,150.14C299.63,148.73 299.63,147.32 299.65,145.91C299.74,134.54 297.75,123.98 289.67,115.46C281.51,108.31 273.42,106.51 262.7,106.69C253.25,107.48 246.5,112.74 240.46,119.8Z"/>
6+
7+
<path android:fillColor="#FE3446" android:pathData="M267.31,128.13C268.07,128.17 268.83,128.21 269.61,128.26C273.14,129.36 274.67,131.16 277,134C277.62,137.38 277.62,137.38 277.6,141.32C277.61,142.05 277.61,142.77 277.61,143.52C277.62,145.96 277.59,148.38 277.57,150.82C277.57,152.56 277.57,154.3 277.57,156.05C277.57,160.78 277.54,165.52 277.51,170.25C277.48,175.2 277.47,180.14 277.47,185.09C277.45,194.46 277.41,203.83 277.36,213.19C277.3,223.86 277.28,234.52 277.25,245.19C277.2,267.13 277.11,289.06 277,311C277.94,311.14 278.88,311.28 279.85,311.43C288.79,313.04 296.49,320.08 302,327C309,338.56 311.09,351 308.32,364.28C306.27,370.34 303.21,375.21 299,380C298.25,380.91 298.25,380.91 297.48,381.84C292.07,387.87 283.12,393.49 274.89,394.18C258.03,394.6 247.64,393.1 235.06,381.16C226.03,371.64 223.47,360.64 223.72,347.86C224.52,336.71 230.24,327.31 238.25,319.75C243.2,315.55 249.3,311 256,311C256,310.1 255.99,309.2 255.99,308.27C255.88,286.33 255.79,264.4 255.74,242.47C255.72,231.86 255.68,221.25 255.62,210.65C255.57,201.4 255.54,192.16 255.53,182.91C255.52,178.02 255.51,173.12 255.47,168.23C255.44,163.62 255.43,159.01 255.43,154.41C255.43,152.71 255.42,151.02 255.4,149.33C255.38,147.02 255.39,144.71 255.4,142.4C255.39,141.11 255.39,139.82 255.38,138.49C256.2,133.89 257.74,132.28 261,129C263.4,127.8 264.66,127.92 267.31,128.13Z"/>
8+
9+
<path android:fillColor="#BF1533" android:pathData="M274.35,331.65C280.44,334.39 284.57,338.94 287.38,344.94C288.94,352.59 288.19,358.37 284,365C279.84,369.62 275.43,372.5 269.2,373.41C261.5,373.65 256.69,372.31 251,367C246.91,361.86 244.43,356.94 244.62,350.25C245.6,344.42 248.58,338.87 253.06,335C259.76,330.44 266.38,329.44 274.35,331.65Z"/>
10+
11+
<path android:fillColor="#3AE4DE" android:pathData="M360.21,212.7C362.23,212.69 364.24,212.64 366.26,212.6C368.18,212.59 368.18,212.59 370.14,212.57C371.9,212.55 371.9,212.55 373.69,212.53C377.7,213.1 379.86,214.5 383,217C384.86,220.71 384.59,224.96 384,229C381.81,231.82 380.17,233.42 377,235C372.93,235.28 368.86,235.31 364.79,235.35C363.44,235.37 362.08,235.39 360.73,235.43C348.06,235.79 348.06,235.79 344.14,232.6C341.19,229.01 340.61,226.8 340.64,222.11C341.28,218.38 343.34,216.6 346,214C350.19,211.91 355.6,212.73 360.21,212.7Z"/>
12+
13+
<path android:fillColor="#39E4DE" android:pathData="M362.44,169.69C363.67,169.67 364.89,169.66 366.16,169.64C367.34,169.64 368.53,169.64 369.75,169.64C370.83,169.63 371.91,169.63 373.02,169.63C377.1,170.14 379.6,171.91 382.79,174.38C384.91,177.22 384.46,180.13 384.36,183.55C383.86,186.95 382.51,188.71 380,191C375.61,193.19 369.75,192.31 364.88,192.35C363.42,192.37 361.97,192.39 360.51,192.43C358.41,192.49 356.3,192.51 354.2,192.52C352.94,192.54 351.68,192.56 350.38,192.58C346.12,191.85 344.69,190.3 342,187C340.4,183.79 340.51,180.48 341,177C346.18,168.5 353.43,169.66 362.44,169.69Z"/>
14+
15+
<path android:fillColor="#39E4DE" android:pathData="M360.12,127.7C362.29,127.69 364.47,127.64 366.64,127.6C368.03,127.59 369.41,127.58 370.8,127.57C372.06,127.56 373.32,127.55 374.62,127.53C378.58,128.08 380.19,129.21 383,132C384.86,135.72 384.58,139.95 384,144C381.47,147.35 379.96,148.68 376,150C371.57,150.29 367.13,150.28 362.69,150.31C361.46,150.34 360.24,150.37 358.98,150.4C347.69,150.48 347.69,150.48 343,146C340.53,142.3 340.32,139.3 341,135C345.68,126.42 351.28,127.75 360.12,127.7Z"/>
16+
17+
</vector>

app/src/main/res/layout/activity_home.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,13 @@
9292
android:layout_width="match_parent"
9393
android:layout_height="wrap_content" />
9494

95+
<!-- button to navigate weather forecast screen -->
96+
<Button
97+
android:id="@+id/btn_weather_forecast"
98+
android:layout_width="wrap_content"
99+
android:layout_height="wrap_content"
100+
android:text="@string/text_weather_forecast" />
101+
95102
<!-- weather details -->
96103
<LinearLayout
97104
android:layout_width="match_parent"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:id="@+id/forecasts"
4+
android:layout_width="match_parent"
5+
android:layout_height="match_parent" />
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:layout_width="match_parent"
4+
android:layout_height="wrap_content"
5+
xmlns:app="http://schemas.android.com/apk/res-auto"
6+
android:layout_gravity="center">
7+
8+
<ImageView android:id="@+id/icon_weather_condition"
9+
android:layout_column="0"
10+
android:layout_row="0"
11+
android:layout_rowSpan="2"
12+
android:layout_height="48dp"
13+
android:layout_width="48dp"
14+
android:layout_margin="12dp"/>
15+
16+
<TextView android:id="@+id/label_weather_condition"
17+
android:layout_column="0"
18+
android:layout_row="2"
19+
android:layout_height="wrap_content"
20+
android:layout_width="wrap_content"
21+
android:layout_margin="8dp"
22+
android:textAlignment="center"
23+
android:textAppearance="@style/TextAppearance.AppCompat.Medium"/>
24+
25+
<TextView android:id="@+id/label_date"
26+
android:layout_column="1"
27+
android:layout_row="0"
28+
android:layout_columnSpan="2"
29+
android:layout_height="wrap_content"
30+
android:layout_width="wrap_content"
31+
android:layout_margin="8dp"
32+
android:textAppearance="@style/TextAppearance.AppCompat.Large"/>
33+
34+
<ImageView android:id="@+id/icon_temperature"
35+
android:layout_column="1"
36+
android:layout_row="1"
37+
android:layout_height="18dp"
38+
android:layout_width="18dp"
39+
android:layout_margin="6dp"
40+
android:layout_gravity="center"
41+
android:src="@drawable/thermometer"/>
42+
43+
<TextView android:id="@+id/label_temperature"
44+
android:layout_column="2"
45+
android:layout_row="1"
46+
android:layout_height="wrap_content"
47+
android:layout_width="wrap_content"
48+
android:layout_margin="6dp"
49+
android:textStyle="bold"
50+
android:textAppearance="@style/TextAppearance.AppCompat.Headline"/>
51+
52+
<ImageView android:id="@+id/icon_precipitation"
53+
android:layout_column="1"
54+
android:layout_row="2"
55+
android:layout_height="18dp"
56+
android:layout_width="18dp"
57+
android:layout_margin="6dp"
58+
android:layout_gravity="center"
59+
android:src="@drawable/precipitation"/>
60+
61+
<TextView android:id="@+id/label_precipitation"
62+
android:layout_column="2"
63+
android:layout_row="2"
64+
android:layout_height="wrap_content"
65+
android:layout_width="wrap_content"
66+
android:layout_margin="6dp"
67+
android:textStyle="bold"
68+
android:textAppearance="@style/TextAppearance.AppCompat.Medium"/>
69+
70+
<com.google.android.material.divider.MaterialDivider
71+
android:layout_column="0"
72+
android:layout_row="4"
73+
android:layout_columnSpan="3"
74+
android:layout_height="2dp"
75+
android:layout_width="match_parent"
76+
android:layout_marginTop="8dp"
77+
app:lastItemDecorated="false"/>
78+
79+
</GridLayout>

app/src/main/res/layout/item_load_more_citites.xml

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)