Samson Joe
Samson Joe

Reputation: 1

How to make generic filtering adapter in kotlin

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

Answers (1)

Azeem Haider
Azeem Haider

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

Related Questions