-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAutoSuggestAdapter.kt
More file actions
90 lines (75 loc) · 3.19 KB
/
AutoSuggestAdapter.kt
File metadata and controls
90 lines (75 loc) · 3.19 KB
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
import android.content.Context
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.Filter
import android.widget.TextView
class AutoSuggestAdapter<T : Any>(context: Context, private val resource: Int, items : List<T> = ArrayList()) :
ArrayAdapter<T>(context, resource, items) {
private val items : ArrayList<T> = ArrayList()
private val suggestions : ArrayList<T> = ArrayList()
var customLayoutHandler : ((View, T) -> Unit)? = null
var noSuggestionsHandler : (() -> Unit)? = null
companion object {
private const val TAG = "[AutoSuggestAdapter] "
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup) : View {
lateinit var v : View
v = if(convertView == null){
val inflater : LayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
inflater.inflate(resource, parent, false)
} else convertView
if(suggestions.size > 0 && position < suggestions.size) {
val item: T = suggestions[position]
if (v is TextView) v.text = item.toString()
else customLayoutHandler?.invoke(v, item)
} else noSuggestionsHandler?.invoke()
return v
}
override fun getFilter() : Filter = itemFilter
override fun add(item: T?) {
if(item != null) super.add(item)
if(item != null && !items.contains(item)) items.add(item)
}
override fun addAll(vararg items: T) {
super.addAll(*items)
this.items.addAll(items)
}
override fun addAll(collection: MutableCollection<out T>) {
super.addAll(collection)
this.items.addAll(collection)
}
fun clearItems(){
items.clear()
}
inner class ItemFilter() : Filter() {
private val sync = object {}
override fun performFiltering(constraint: CharSequence?): FilterResults {
if(constraint != null){
suggestions.clear()
items.forEach { item ->
if(item.toString().toLowerCase(Locale.US).contains(constraint.toString().toLowerCase(Locale.US))) suggestions.add(item)
}
val fResults : FilterResults = FilterResults()
fResults.values = suggestions
fResults.count = suggestions.size
return fResults
}
return FilterResults()
}
override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
if(results != null && results.count > 0){
var filterList : ArrayList<T> = results.values as ArrayList<T>
clear()
filterList.toArray().forEach { item -> add(item as T) }
notifyDataSetChanged()
} else noSuggestionsHandler?.invoke()
}
override fun convertResultToString(resultValue: Any?): CharSequence {
return resultValue?.toString() ?: ""
}
}
private val itemFilter : ItemFilter = ItemFilter()
}