Reputation: 1
How to implement generic filtering adapter using Kotlin extension function?. I am new to android. So please guide me step by step.
Upvotes: 0
Views: 414
Reputation: 216
Step 1.
Create a koltin class for extension functions, named for example Extentions.kt. Add this function to your Extentions class.
fun <T : Any> RecyclerView.withFilteredAdapter(
dataList: List<T>, @LayoutRes layoutID: Int,
onBindView: BaseViewHolder<T>.(data: T) -> Unit): FilteredRecyclerAdapter<T> {
val recyclerAdapter = FilteredRecyclerAdapter(dataList, layoutID, onBindView)
adapter = recyclerAdapter
return recyclerAdapter }
Step 2.
Create class BaseViewHolder.kt
class BaseViewHolder<in T>(parent: ViewGroup, @LayoutRes layoutId: Int) :
RecyclerView.ViewHolder(parent.inflater(layoutId))
Step 3. Create recycleriew adapter class named FilteredRecyclerAdapter.kt
class FilteredRecyclerAdapter<RecyclerData : Any>(
data: List<RecyclerData>, @LayoutRes layoutID: Int,
private val onBindView: BaseViewHolder<RecyclerData>.(data: RecyclerData) -> Unit): BaseRecyclerAdapter<RecyclerData>(data), Filterable {
override val layoutItemId: Int = layoutID
var dataListFilter: List<RecyclerData> = dataList
override fun getItemCount(): Int = dataListFilter.size
override fun onBindViewHolder(holder: BaseViewHolder<RecyclerData>, position: Int) {
holder.onBindView(dataListFilter[position])
}
override fun getFilter(): Filter {
return object : Filter() {
override fun performFiltering(constraint: CharSequence?): FilterResults {
val charSearch = constraint.toString()
if (charSearch.isEmpty()) {
dataListFilter = dataList
} else {
val resultList = ArrayList<RecyclerData>()
for (row in dataList) {
row as String
if(row.toLowerCase(Locale.ROOT).contains(charSearch.toLowerCase(Locale.ROOT))){
resultList.add(row as RecyclerData)
}
}
dataListFilter = resultList
}
val filterResults = FilterResults()
filterResults.values = dataListFilter
return filterResults
}
@Suppress("UNCHECKED_CAST")
override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
dataListFilter = results?.values as ArrayList<RecyclerData>
notifyDataSetChanged()
}
}
}}
Step 4.
Now Simply use in your activity/fragment class like below.
val adapter= recyclerview.withFilteredAdapter(array, R.layout.list_item_2) { str ->
itemView.tv.text = str}
Start filtering like below.
override fun onQueryTextChange(newText: String?): Boolean {
adapter.filter.filter(newText)
return false
}
Upvotes: 6