Guest User

Untitled

a guest
Sep 9th, 2021
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 11.29 KB | None | 0 0
  1. package io.polydevs.Nets.graph.dialogs.departments
  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 androidx.recyclerview.widget.RecyclerView
  10. import com.google.android.material.checkbox.MaterialCheckBox
  11. import io.polydevs.Nets.R
  12. import io.polydevs.Nets.databinding.GraphDialogItemBinding
  13. import io.polydevs.Nets.databinding.GraphDialogSubgroupItemBinding
  14. import io.polydevs.Nets.models.DepartmentsRowModel
  15. import io.polydevs.Nets.models.DepartmentsRowType
  16. import io.polydevs.Nets.models.NetType
  17. import io.polydevs.Nets.setMarginsInDp
  18.  
  19. class DepartmentsRecyclerViewAdapter(
  20.     val context: Context,
  21.     val elements: List<DepartmentsRowModel>
  22. ) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
  23.  
  24.     inner class DepartmentsDropdownViewHolder(val binding: GraphDialogItemBinding) :
  25.         RecyclerView.ViewHolder(binding.root)
  26.  
  27.     inner class DepartmentsViewHolder(val binding: GraphDialogSubgroupItemBinding) :
  28.         RecyclerView.ViewHolder(binding.root)
  29.  
  30.     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
  31.         return when (viewType) {
  32.             1 -> DepartmentsDropdownViewHolder(
  33.                 GraphDialogItemBinding.inflate(
  34.                     LayoutInflater.from(
  35.                         parent.context
  36.                     ),
  37.                     parent, false
  38.                 )
  39.             )
  40.             else -> DepartmentsViewHolder(
  41.                 GraphDialogSubgroupItemBinding.inflate(
  42.                     LayoutInflater.from(
  43.                         parent.context
  44.                     ),
  45.                     parent, false
  46.                 )
  47.             )
  48.         }
  49.     }
  50.  
  51.     override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
  52.  
  53.         val item = elements[position]
  54.  
  55.         when (holder.itemViewType) {
  56.             0 -> {
  57.                 // Select All
  58.                 with(holder as DepartmentsViewHolder) {
  59.                     this.binding.apply {
  60.                         val params: ViewGroup.MarginLayoutParams =
  61.                             holder.binding.graphDialogSubgroupCheckbox.layoutParams as ViewGroup.MarginLayoutParams
  62.                         params.setMarginsInDp(context, 0f, 0f, 0f, 16f)
  63.                         graphDialogSubgroupCheckbox.apply {
  64.                             layoutParams = params
  65.                             text = "Выбрать все"
  66.                             isChecked = item.isChecked
  67.                             setOnClickListener {
  68.                                 checkAndUncheckAll((it as MaterialCheckBox).isChecked)
  69.                             }
  70.                         }
  71.                     }
  72.                 }
  73.             }
  74.             1 -> {
  75.                 // Network
  76.                 with(holder as DepartmentsDropdownViewHolder) {
  77.                     this.binding.apply {
  78.                         lateinit var params: ViewGroup.MarginLayoutParams
  79.                         if (item.isVisible == View.VISIBLE) {
  80.                             params = RecyclerView.LayoutParams(
  81.                                 ViewGroup.LayoutParams.MATCH_PARENT,
  82.                                 ViewGroup.LayoutParams.WRAP_CONTENT
  83.                             )
  84.                             params.setMarginsInDp(context, 32f, 0f, 0f, 16f)
  85.                         } else {
  86.                             params = RecyclerView.LayoutParams(0, 0)
  87.                             params.setMargins(0, 0, 0, 0)
  88.                         }
  89.                         graphDialogItemConstraintLayout.apply {
  90.                             layoutParams = params
  91.                             graphDialogItemConstraintLayout.visibility = item.isVisible
  92.                         }
  93.  
  94.                         graphDialogItemNameTextView.apply {
  95.                             text = if (item.network == NetType.Moscow) {
  96.                                 "Московские кабельные сети"
  97.                             } else {
  98.                                 "Восточные электрические сети"
  99.                             }
  100.                             setOnClickListener {
  101.                                 dropdownAreaStateChanged(
  102.                                     graphDialogItemDropdownImageView,
  103.                                     item.network!!
  104.                                 )
  105.                             }
  106.                         }
  107.  
  108.                         graphDialogItemDropdownImageView.setOnClickListener {
  109.                             dropdownAreaStateChanged(it, item.network!!)
  110.                         }
  111.  
  112.                         graphDialogItemMaterialCheckbox.apply {
  113.                             isChecked = item.isChecked
  114.                             setOnClickListener {
  115.                                 checkAndUncheckAreas(
  116.                                     item.network,
  117.                                     (it as MaterialCheckBox).isChecked
  118.                                 )
  119.                                 isAllSelected()
  120.                             }
  121.                         }
  122.                     }
  123.                 }
  124.             }
  125.             else -> {
  126.                 // Area
  127.                 with(holder as DepartmentsViewHolder) {
  128.                     this.binding.apply {
  129.                         lateinit var params: ViewGroup.MarginLayoutParams
  130.                         if (item.isVisible == View.VISIBLE) {
  131.                             params = RecyclerView.LayoutParams(
  132.                                 ViewGroup.LayoutParams.MATCH_PARENT,
  133.                                 ViewGroup.LayoutParams.WRAP_CONTENT
  134.                             )
  135.                             params.setMarginsInDp(context, 64f, 0f, 0f, 16f)
  136.                         } else {
  137.                             params = RecyclerView.LayoutParams(0, 0)
  138.                             params.setMargins(0, 0, 0, 0)
  139.                         }
  140.                         graphDialogSubgroupCheckbox.apply {
  141.                             layoutParams = params
  142.                             visibility = item.isVisible
  143.                             isChecked = item.isChecked
  144.                             text = item.area
  145.                             isClickable = true
  146.                             setOnClickListener {
  147.                                 isAllSelected()
  148.                             }
  149.                         }
  150.                     }
  151.                 }
  152.             }
  153.         }
  154.     }
  155.  
  156.     override fun getItemCount() = elements.size
  157.  
  158.     override fun getItemViewType(position: Int): Int {
  159.         return elements[position].rowType.ordinal
  160.     }
  161.  
  162.     private fun isAllSelected() {
  163.         val moscowAreas = elements.filter { it.rowType == DepartmentsRowType.AreaHeader && it.network == NetType.Moscow }.size
  164.         Log.d("areas", "Moscow all $moscowAreas")
  165.         val checkedMoscowAreas = elements.filter { it.rowType == DepartmentsRowType.AreaHeader && it.network == NetType.Moscow && it.isChecked }.size
  166.         Log.d("areas", "Moscow checked $checkedMoscowAreas")
  167.  
  168.         val eastAreas = elements.filter { it.rowType == DepartmentsRowType.AreaHeader && it.network == NetType.East }.size
  169.         Log.d("areas", "East all $eastAreas")
  170.         val checkedEastAreas = elements.filter { it.rowType == DepartmentsRowType.AreaHeader && it.network == NetType.East && it.isChecked }.size
  171.         Log.d("areas", "East checked $moscowAreas")
  172.  
  173.         if (moscowAreas == checkedMoscowAreas) {
  174.             elements.filter { it.rowType == DepartmentsRowType.NetworkHeader && it.network == NetType.Moscow }.forEach {
  175.                 it.isChecked = true
  176.                 notifyItemChanged(elements.indexOf(it))
  177.             }
  178.         } else {
  179.             elements.filter { it.rowType == DepartmentsRowType.NetworkHeader && it.network == NetType.Moscow }.forEach {
  180.                 it.isChecked = false
  181.                 notifyItemChanged(elements.indexOf(it))
  182.             }
  183.         }
  184.  
  185.         if (eastAreas == checkedEastAreas) {
  186.             elements.filter { it.rowType == DepartmentsRowType.NetworkHeader && it.network == NetType.East }.forEach {
  187.                 it.isChecked = true
  188.                 notifyItemChanged(elements.indexOf(it))
  189.             }
  190.         } else {
  191.             elements.filter { it.rowType == DepartmentsRowType.NetworkHeader && it.network == NetType.East }.forEach {
  192.                 it.isChecked = false
  193.                 notifyItemChanged(elements.indexOf(it))
  194.             }
  195.         }
  196.  
  197.         if (elements.filter { it.rowType == DepartmentsRowType.NetworkHeader }.all { it.isChecked }) {
  198.             elements.filter { it.rowType == DepartmentsRowType.TopHeader }.forEach {
  199.                 it.isChecked = true
  200.                 notifyItemChanged(elements.indexOf(it))
  201.             }
  202.         } else {
  203.             elements.filter { it.rowType == DepartmentsRowType.TopHeader }.forEach {
  204.                 it.isChecked = false
  205.                 notifyItemChanged(elements.indexOf(it))
  206.             }
  207.         }
  208.         notifyDataSetChanged()
  209.     }
  210.  
  211.     private fun dropdownAreaStateChanged(view: View, netType: NetType) {
  212.         if (view.tag == "Closed") {
  213.             view.tag = "Opened"
  214.             (view as ImageView).setImageResource(R.drawable.dropdown_opened)
  215.             showAreas(netType)
  216.         } else {
  217.             view.tag = "Closed"
  218.             (view as ImageView).setImageResource(R.drawable.dropdown_closed)
  219.             hideAreas(netType)
  220.         }
  221.     }
  222.  
  223.     private fun checkAndUncheckAreas(netType: NetType?, isChecked: Boolean) {
  224.         val areas = mutableListOf<Int>()
  225.         if (netType != null) {
  226.             elements.filter { it.rowType == DepartmentsRowType.AreaHeader && it.network == netType }
  227.                 .forEach {
  228.                     it.isChecked = isChecked
  229.                     areas.add(elements.indexOf(it))
  230.                 }
  231.         } else {
  232.             elements.filter { it.rowType == DepartmentsRowType.AreaHeader }.forEach {
  233.                 it.isChecked = isChecked
  234.                 areas.add(elements.indexOf(it))
  235.             }
  236.         }
  237.         areas.forEach {
  238.             notifyItemChanged(it)
  239.         }
  240.         notifyDataSetChanged()
  241.     }
  242.  
  243.     private fun checkAndUncheckAll(isChecked: Boolean) {
  244.         elements.forEach {
  245.             it.isChecked = isChecked
  246.             notifyItemChanged(elements.indexOf(it))
  247.         }
  248.         notifyDataSetChanged()
  249.     }
  250.  
  251.     private fun hideAreas(netType: NetType) {
  252.         val areas = mutableListOf<Int>()
  253.         elements.filter { it.rowType == DepartmentsRowType.AreaHeader && it.network == netType }
  254.             .forEach {
  255.                 it.isVisible = View.GONE
  256.                 areas.add(elements.indexOf(it))
  257.             }
  258.         areas.forEach {
  259.             notifyItemChanged(it)
  260.         }
  261.         notifyDataSetChanged()
  262.     }
  263.  
  264.     private fun showAreas(netType: NetType) {
  265.         val areas = mutableListOf<Int>()
  266.         elements.filter { it.rowType == DepartmentsRowType.AreaHeader && it.network == netType }
  267.             .forEach {
  268.                 it.isVisible = View.VISIBLE
  269.                 areas.add(elements.indexOf(it))
  270.             }
  271.         areas.forEach {
  272.             notifyItemChanged(it)
  273.         }
  274.         notifyDataSetChanged()
  275.     }
  276. }
  277.  
Advertisement
Add Comment
Please, Sign In to add comment