RoomsAdapter.kt 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package com.rdiot.yx485.adapter
  2. import android.graphics.Rect
  3. import android.view.LayoutInflater
  4. import android.view.View
  5. import android.view.ViewGroup
  6. import androidx.databinding.DataBindingUtil
  7. import androidx.recyclerview.widget.RecyclerView
  8. import com.rdiot.yx485.R
  9. import com.rdiot.yx485.base.LocalData
  10. import com.rdiot.yx485.bean.RoomData
  11. import com.rdiot.yx485.databinding.ItemRoomBinding
  12. import com.rdiot.yx485.util.dp
  13. import com.rdiot.yx485.util.setClickLimitListener
  14. /**
  15. * 房间列表
  16. * @author mR2hao
  17. * @date 2021/10/14
  18. */
  19. class RoomsAdapter(
  20. private val mListener: OnItemClickListener? = null
  21. ) :
  22. RecyclerView.Adapter<RoomsAdapter.RoomViewHolder>() {
  23. /** 变量 是否为编辑模式 */
  24. private var isEditMode = false
  25. private var mList: MutableList<RoomData> = mutableListOf()
  26. interface OnItemClickListener {
  27. fun onItemClicked(position: Int, roomInfo: RoomData)
  28. fun onSwitchClicked(position: Int, roomInfo: RoomData)
  29. fun onDelClicked(position: Int, roomInfo: RoomData)
  30. }
  31. inner class RoomViewHolder(val binding: ItemRoomBinding) :
  32. RecyclerView.ViewHolder(binding.root) {
  33. fun bind(info: RoomData) {
  34. binding.vm = info
  35. binding.editMode = isEditMode
  36. binding.executePendingBindings()
  37. }
  38. }
  39. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RoomViewHolder {
  40. val binding: ItemRoomBinding = DataBindingUtil.inflate(
  41. LayoutInflater.from(parent.context),
  42. R.layout.item_room,
  43. parent,
  44. false
  45. )
  46. return RoomViewHolder(binding)
  47. }
  48. override fun onBindViewHolder(holder: RoomViewHolder, position: Int) {
  49. val bean = mList[position]
  50. holder.bind(bean)
  51. holder.binding.clItem.setClickLimitListener {
  52. mListener?.onItemClicked(position, bean)
  53. }
  54. holder.binding.ivSwitch.setClickLimitListener {
  55. mListener?.onSwitchClicked(position, bean)
  56. }
  57. holder.binding.ivDel.setClickLimitListener {
  58. mListener?.onDelClicked(position, bean)
  59. }
  60. }
  61. override fun getItemCount(): Int {
  62. return mList.size
  63. }
  64. /** 切换是否为编辑模式 */
  65. fun setEditMode(on: Boolean) {
  66. if (isEditMode != on) {
  67. isEditMode = on
  68. }
  69. notifyDataSetChanged()
  70. }
  71. fun isEditMode() = isEditMode
  72. @Synchronized
  73. fun update(list: List<RoomData>) {
  74. if (list.size < this.mList.size) {
  75. mList.clear()
  76. mList.addAll(list)
  77. notifyDataSetChanged()
  78. } else {
  79. for (i in list.indices) {
  80. if (i < this.mList.size) {
  81. if (this.mList[i] != list[i]) {
  82. this.mList[i] = list[i]
  83. notifyItemChanged(i)
  84. }
  85. } else {
  86. this.mList.add(list[i])
  87. notifyItemInserted(i)
  88. }
  89. }
  90. }
  91. }
  92. fun removeRoom(roomData: RoomData) {
  93. mList.remove(roomData)
  94. val tempList = mutableListOf<RoomData>()
  95. for (room in mList) {
  96. tempList.add(room)
  97. }
  98. LocalData.familyData.postValue(
  99. LocalData.familyData.value.apply {
  100. this?.room = mList
  101. }
  102. )
  103. notifyDataSetChanged()
  104. // update(tempList)
  105. }
  106. }
  107. class RoomItemDecoration(private val top: Int = 0, private val bottom: Int) :
  108. RecyclerView.ItemDecoration() {
  109. override fun getItemOffsets(
  110. outRect: Rect,
  111. view: View,
  112. parent: RecyclerView,
  113. state: RecyclerView.State
  114. ) {
  115. super.getItemOffsets(outRect, view, parent, state)
  116. //获取当前要进行布局的item的position
  117. when (parent.getChildLayoutPosition(view)) {
  118. 0, 1 -> {
  119. outRect.top = top
  120. outRect.bottom = bottom
  121. }
  122. else -> {
  123. outRect.bottom = bottom
  124. }
  125. }
  126. if (parent.getChildLayoutPosition(view) % 2 == 0) {
  127. outRect.left = 15.dp
  128. outRect.right = 5.dp
  129. } else {
  130. outRect.left = 5.dp
  131. outRect.right = 15.dp
  132. }
  133. }
  134. }