Ostanimi czasy zacząłem sobie dłubać w Kotlin małą apkę na Andka. Taka mobilna wersja jednego z serwisów które mam do obsługi danych. Nic wielkiego.
Mam sobie taki kod:
Kod
class MainActivity : AppCompatActivity() {
var menu: Menu? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recycleView_main.layoutManager = LinearLayoutManager(this)
fetchAndBuildList()
}
private fun fetchAndBuildList() {
val request = Request.Builder().url("http://192.168.2.101/api/v1/user").build()
val client = OkHttpClient()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
TODO("not implemented")
}
override fun onResponse(call: Call, response: Response) {
val gson = GsonBuilder().create()
val userList = gson.fromJson(response.body()?.string(), Array<SimpleUser>::class.java)
runOnUiThread {
val adapter = MainListAdapter(userList)
recycleView_main.adapter = adapter
setMenuFiltering(adapter)
}
}
})
}
private fun setMenuFiltering(adapter: MainListAdapter) {
val searchView = menu?.findItem(R.id.menu_search)?.actionView as SearchView
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(string: String?) = true
override fun onQueryTextChange(string: String?): Boolean {
adapter.filter.filter(string)
return true
}
})
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main, menu)
this.menu = menu
return super.onCreateOptionsMenu(menu)
}
}
var menu: Menu? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recycleView_main.layoutManager = LinearLayoutManager(this)
fetchAndBuildList()
}
private fun fetchAndBuildList() {
val request = Request.Builder().url("http://192.168.2.101/api/v1/user").build()
val client = OkHttpClient()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
TODO("not implemented")
}
override fun onResponse(call: Call, response: Response) {
val gson = GsonBuilder().create()
val userList = gson.fromJson(response.body()?.string(), Array<SimpleUser>::class.java)
runOnUiThread {
val adapter = MainListAdapter(userList)
recycleView_main.adapter = adapter
setMenuFiltering(adapter)
}
}
})
}
private fun setMenuFiltering(adapter: MainListAdapter) {
val searchView = menu?.findItem(R.id.menu_search)?.actionView as SearchView
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(string: String?) = true
override fun onQueryTextChange(string: String?): Boolean {
adapter.filter.filter(string)
return true
}
})
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main, menu)
this.menu = menu
return super.onCreateOptionsMenu(menu)
}
}
To jest aktywnośc która wyświela listę userów z możliwością wyszukiwania.
Teraz chciałem dodać do tego jeszcze Full Screenn Progress Bar (odpowiednik CSS Preloader)
Zastanawiam się czy są jakieś koncepty gdzie:
// mogę pobierać dane z REST przez okhttp3 (aktualnie jest enqueue)
// Generować widok
// Wrzucić przeloader zanim zaczytają się dane z REST i przegeneruje się widok.
Ja wieem że ten kod może wołać o pomstę do Nieba

Ew. może ktoś ma jakiś fajny blog o Kotlinie.