18034727885
2026-04-14 370014cbb9ec1ef64e7e42bb4f9a12671461d8e4
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
140
141
142
143
144
145
146
147
148
149
150
151
package com.xw.common.base
 
import android.annotation.SuppressLint
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.recyclerview.widget.RecyclerView
import com.xw.common.R
import com.xw.common.databinding.CommonItemImageAddBinding
import com.xw.common.databinding.CommonItemImageEmptyBinding
import com.xw.common.databinding.CommonItemImageShowBinding
 
class ImageSelectAdapter(
    var context: Context,
    var maxSize: Int,
    isEdit: Int = 1, // 是否可编辑 1:可编辑 else:仅查看
    var listener: ImageEventListener<FileSelectBean>
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
 
    var isEdit: Int = isEdit
        @SuppressLint("NotifyDataSetChanged")
        set(value) {
            field = value
            notifyDataSetChanged()
        }
 
    fun remove(data: FileSelectBean) {
        val index = this.data.indexOf(data)
        if (index == -1) {
            return
        }
        this.data.removeAt(index)
        notifyItemRemoved(index)
        notifyItemRangeChanged(index, this.data.size - index)
    }
 
    @SuppressLint("NotifyDataSetChanged")
    fun setList(list: Collection<FileSelectBean>?) {
        if (list !== this.data) {
            this.data.clear()
            if (!list.isNullOrEmpty()) {
                this.data.addAll(list)
            }
        } else {
            if (!list.isEmpty()) {
                val newList = ArrayList(list)
                this.data.clear()
                this.data.addAll(newList)
            } else {
                this.data.clear()
            }
        }
        notifyDataSetChanged()
    }
 
    var data: MutableList<FileSelectBean> = ArrayList()
 
    private val TYPE_ITEM = 1
    private val TYPE_EMPTY = 2
    private val TYPE_ADD = 3
 
    private val inflater by lazy { LayoutInflater.from(context) }
 
    override fun getItemCount(): Int {
        return if (isEdit == 1) {
            if (data.size >= maxSize) maxSize else data.size + 1
        } else {
            if (data.isEmpty()) 1 else data.size // 没有图片加载一个null的站位图
        }
    }
 
    override fun getItemViewType(position: Int): Int {
        return if (isEdit == 1) {
            if (data.size == maxSize) {
                TYPE_ITEM
            } else {
                if (position + 1 == itemCount) {
                    TYPE_ADD
                } else {
                    TYPE_ITEM
                }
            }
        } else {
            if (data.isEmpty()) TYPE_EMPTY else TYPE_ITEM
        }
    }
 
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val binding = if (viewType == TYPE_ITEM) {
            DataBindingUtil.inflate<ViewDataBinding>(
                inflater,
                R.layout.common_item_image_show,
                parent,
                false
            )
        } else if (viewType == TYPE_EMPTY) {
            DataBindingUtil.inflate<ViewDataBinding>(
                inflater,
                R.layout.common_item_image_empty,
                parent,
                false
            )
        } else {
            DataBindingUtil.inflate(
                inflater,
                R.layout.common_item_image_add,
                parent,
                false
            )
        }
        return ViewHolder(binding.root, binding)
    }
 
 
    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        (holder as ViewHolder).bindData(position)
    }
 
    inner class ViewHolder(itemView: View, var mBinding: ViewDataBinding) : RecyclerView.ViewHolder(itemView) {
 
        fun bindData(position: Int) {
 
            if (mBinding is CommonItemImageShowBinding) {
                val item = data[position]
                val binding: CommonItemImageShowBinding = mBinding as CommonItemImageShowBinding
                binding.listener = listener
                binding.item = item
                binding.delete.visibility = if (isEdit == 1) View.VISIBLE else View.GONE
                binding.ivPlay.visibility = if (item.type == "video") View.VISIBLE else View.GONE
            } else if (mBinding is CommonItemImageAddBinding) {
                val item = FileSelectBean()
                val binding: CommonItemImageAddBinding = mBinding as CommonItemImageAddBinding
                binding.listener = listener
                binding.item = item
            }
        }
    }
}
 
data class FileSelectBean(
    var url: String = "",
    var localPath: String = "",
    var type: String = "", // video  ic_notice  audio
){
    override fun toString(): String {
        return "FileSelectBean(url='$url', localPath='$localPath', type='$type')"
    }
}