18034727885
2026-06-26 253f680fb9666751e0f9a8e5e8f2f9e3eb1894e3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package com.example.smart.ui.exclude.adapter
 
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView.Adapter
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.example.basecore.widget.CheckBoxSample
import com.example.smart.R
import com.example.smart.ui.projectevent.bean.SystemTreeBean
 
 
class PassCAdapter(
    private val mContext: Context,
    var data: ArrayList<SystemTreeBean>,
    val projectId: String,
    val selectItems: ArrayList<String>
) : Adapter<PassCAdapter.PageViewHolder>() {
 
    /**
     * 全选集合,为了解决一个adapter多个数据源的问题,
     * @param key parent_id
     * @param value 是否全选
     */
    private val allMap = mutableMapOf<Int, Boolean>()
 
    init {
        handleSourceDataState()
    }
 
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PageViewHolder {
        return PageViewHolder(
            LayoutInflater.from(mContext).inflate(R.layout.item_exlcude_problem_view, parent, false)
        )
    }
 
    override fun getItemCount() = if (data.isNotEmpty()) data.size + 1 else 0
 
    override fun onBindViewHolder(holder: PageViewHolder, position: Int) {
 
        val realPosition = position - 1
        if (position == 0) {
            holder.contentTv.text = "全选"
            val parentId = findParentId()
            val isSelect = allMap[parentId] ?: false
            if (isSelect) {
                holder.checkbox.setChecked(true, false)
            } else {
                holder.checkbox.setChecked(false, false)
            }
        } else {
            val bean = data[realPosition]
            holder.contentTv.text = bean.name
            if (selectItems.contains(bean.path)) {
                holder.checkbox.setChecked(true, false)
            } else {
                holder.checkbox.setChecked(false, false)
            }
        }
 
        holder.checkbox.setOnClickListener {
            if (position == 0) {
                val parentId = findParentId()
                val isSelect = allMap[parentId] ?: false
                allMap[parentId] = !isSelect
                selectAll(!isSelect)
            } else {
                val bean = data[realPosition]
                holder.checkbox.toggle()
                if (selectItems.contains(bean.path)) {
                    selectItems.remove(bean.path)
                } else {
                    selectItems.add(bean.path)
                }
                handleSourceDataState()
                notifyDataSetChanged()
            }
        }
    }
 
    /**
     * selectItems 包含所有的选项,不能全部清除
     */
    private fun selectAll(isSelect: Boolean) {
        for (bean in data) {
            if (isSelect) {
                if (!selectItems.contains(bean.path))
                    selectItems.add(bean.path)
            } else {
                selectItems.remove(bean.path)
            }
        }
        notifyDataSetChanged()
    }
 
    fun notifyCChanged(newItem: List<SystemTreeBean>) {
        data = newItem as ArrayList<SystemTreeBean>
        handleSourceDataState()
        notifyDataSetChanged()
    }
 
    /**
     * find is select all by source data
     */
    private fun handleSourceDataState() {
        val parentId = findParentId()
        val selectedState = getAllSelectedState()
        allMap[parentId] = selectedState
    }
 
    private fun getAllSelectedState(): Boolean {
        for (m in data) {
            if (!selectItems.contains(m.path)) {
                return false
            }
        }
        return true
    }
 
    private fun findParentId(): Int {
        if (data.isNotEmpty()) {
            return data[0].childIdCnt
        }
        return 0
    }
 
    inner class PageViewHolder(itemView: View) : ViewHolder(itemView) {
        val contentTv: TextView
        val checkbox: CheckBoxSample
 
        init {
            contentTv = itemView.findViewById(R.id.content_tv)
            checkbox = itemView.findViewById(R.id.checkbox)
        }
    }
 
}