WeatherAdapter.kt 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import android.app.Activity
  2. import android.content.Context
  3. import android.util.Log
  4. import android.view.LayoutInflater
  5. import android.view.View
  6. import android.view.ViewGroup
  7. import android.widget.ImageView
  8. import android.widget.LinearLayout
  9. import android.widget.TextView
  10. import androidx.recyclerview.widget.RecyclerView
  11. import java.lang.Exception
  12. import java.util.ArrayList
  13. /*
  14. Класс адаптера наследуется от RecyclerView.Adapter с указанием класса,
  15. который будет хранить ссылки на виджеты элемента списка, т.е. класса, реализующего ViewHolder.
  16. В нашем случае класс объявлен внутри класса адаптера.
  17. В параметры основного конструктора передаем список c данными о погоде и указатель на активити главного окна
  18. дело в том, что runOnUiThread работает только в контексте активити
  19. Использование:
  20. в КЛАССЕ активности объявляем переменные
  21. private lateinit var someRecyclerView: RecyclerView
  22. private val someClassList = ArrayList<SomeClass>()
  23. в КОНСТРУКТОРЕ инициализируем:
  24. someRecyclerView = findViewById(R.id.someRecyclerView)
  25. // назначаем менеджер разметки
  26. someRecyclerView.layoutManager = LinearLayoutManager(this, RecyclerView.HORIZONTAL, false)
  27. // создаем адаптер
  28. val someClassAdapter = WeatherAdapter(someClassList, this)
  29. // при клике на элемент списка показать подробную информацию (сделайте сами)
  30. someClassAdapter.setItemClickListener { weather ->
  31. Log.d("KEILOG", "Click on Weather item")
  32. }
  33. someRecyclerView.adapter = weatherAdapter
  34. разбор JSONObject
  35. // перед заполнением очищаем список
  36. someClassList.clear()
  37. val json = JSONObject(result)
  38. val list = json.getJSONArray("list")
  39. // перебираем json массив
  40. for(i in 0 until list.length()){
  41. val item = list.getJSONObject(i)
  42. ...
  43. */
  44. class WeatherAdapter(
  45. private val values: ArrayList<Weather>,
  46. private val activity: Activity
  47. ): RecyclerView.Adapter<WeatherAdapter.ViewHolder>(){
  48. // обработчик клика по элементу списка (лямбда выражение), может быть не задан
  49. private var itemClickListener: ((Weather) -> Unit)? = null
  50. fun setItemClickListener(itemClickListener: (Weather) -> Unit) {
  51. this.itemClickListener = itemClickListener
  52. }
  53. // Метод onCreateViewHolder вызывается при создании визуального элемента
  54. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
  55. // грузим layout, который содержит вёрстку элемента списка (нарисуйте сами)
  56. val itemView = LayoutInflater
  57. .from(parent.context)
  58. .inflate(R.layout.weather_item,
  59. parent,
  60. false)
  61. // создаем на его основе ViewHolder
  62. return ViewHolder(itemView)
  63. }
  64. override fun getItemCount(): Int = values.size
  65. // заполняет визуальный элемент данными
  66. override fun onBindViewHolder(holder: ViewHolder, position: Int) {
  67. holder.tempTextView.text = "${values[position].mainTemp} C"
  68. // onIconLoad.invoke(holder.iconImageView, values[position].weatherIcon)
  69. holder.container.setOnClickListener {
  70. //кликнули на элемент списка
  71. itemClickListener?.invoke(values[position])
  72. }
  73. HTTP.getImage("https://openweathermap.org/img/w/${values[position].weatherIcon}.png") { bitmap, error ->
  74. if (bitmap != null) {
  75. activity.runOnUiThread {
  76. try {
  77. holder.iconImageView.setImageBitmap(bitmap)
  78. } catch (e: Exception) {
  79. }
  80. }
  81. } else
  82. Log.d("KEILOG", error)
  83. }
  84. }
  85. //Реализация класса ViewHolder, хранящего ссылки на виджеты.
  86. class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
  87. var iconImageView: ImageView = itemView.findViewById(R.id.weather_icon)
  88. var tempTextView: TextView = itemView.findViewById(R.id.weather_temp)
  89. var container: LinearLayout = itemView.findViewById(R.id.container)
  90. }
  91. }