WeatherAdapter.kt 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package ru.yotc.myapplication
  2. import android.app.Activity
  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.LinearLayout
  10. import android.widget.TextView
  11. import androidx.recyclerview.widget.RecyclerView
  12. import java.lang.Exception
  13. import java.util.ArrayList
  14. /**
  15. * Класс адаптера наследуется от RecyclerView.Adapter с указанием класса,
  16. * который будет хранить ссылки на виджеты элемента списка, т.е. класса, реализующего ViewHolder.
  17. * В нашем случае класс объявлен внутри класса адаптера.
  18. *
  19. * В параметры основного конструктора передаем список c данными о погоде и указатель на активити главного окна
  20. * дело в том, что runOnUiThread работает только в контексте активити
  21. */
  22. class WeatherAdapter(
  23. private val values: ArrayList<Weather>,
  24. private val activity: Activity
  25. ): RecyclerView.Adapter<WeatherAdapter.ViewHolder>(){
  26. // обработчик клика по элементу списка (лямбда выражение), может быть не задан
  27. private var itemClickListener: ((Weather) -> Unit)? = null
  28. fun setItemClickListener(itemClickListener: (Weather) -> Unit) {
  29. this.itemClickListener = itemClickListener
  30. }
  31. // Метод onCreateViewHolder вызывается при создании визуального элемента
  32. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
  33. // грузим layout, который содержит вёрстку элемента списка (нарисуйте сами)
  34. val itemView = LayoutInflater
  35. .from(parent.context)
  36. .inflate(R.layout.weather_item,
  37. parent,
  38. false)
  39. // создаем на его основе ViewHolder
  40. return ViewHolder(itemView)
  41. }
  42. override fun getItemCount(): Int = values.size
  43. // заполняет визуальный элемент данными
  44. override fun onBindViewHolder(holder: ViewHolder, position: Int) {
  45. holder.tempTextView.text = "${values[position].mainTemp} C"
  46. // onIconLoad.invoke(holder.iconImageView, values[position].weatherIcon)
  47. holder.container.setOnClickListener {
  48. //кликнули на элемент списка
  49. itemClickListener?.invoke(values[position])
  50. }
  51. HTTP.getImage("https://openweathermap.org/img/w/${values[position].weatherIcon}.png") { bitmap, error ->
  52. if (bitmap != null) {
  53. activity.runOnUiThread {
  54. try {
  55. holder.iconImageView.setImageBitmap(bitmap)
  56. } catch (e: Exception) {
  57. }
  58. }
  59. } else
  60. Log.d("KEILOG", error)
  61. }
  62. }
  63. //Реализация класса ViewHolder, хранящего ссылки на виджеты.
  64. class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
  65. var iconImageView: ImageView = itemView.findViewById(R.id.weather_icon)
  66. var tempTextView: TextView = itemView.findViewById(R.id.weather_temp)
  67. var container: LinearLayout = itemView.findViewById(R.id.container)
  68. }
  69. }