【问题标题】:How to make generic filtering adapter in kotlin如何在 kotlin 中制作通用过滤适配器
【发布时间】:2021-06-28 02:59:35
【问题描述】:

如何使用 Kotlin 扩展功能实现通用过滤适配器?我是安卓新手。所以请一步步指导我。

【问题讨论】:

    标签: android kotlin android-recyclerview filtering


    【解决方案1】:

    第 1 步。

    为扩展函数创建一个 koltin 类,例如 Extentions.kt。 将此函数添加到您的扩展类中。

    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 }
    

    第 2 步。

    创建类 BaseViewHolder.kt

    class BaseViewHolder<in T>(parent: ViewGroup, @LayoutRes layoutId: Int) :
    RecyclerView.ViewHolder(parent.inflater(layoutId))
    

    第 3 步。 创建名为 FilteredRecyclerAdapter.kt 的 recycleriew 适配器类

    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()
            }
    
        }
    }}
    

    第 4 步。

    现在只需在您的活动/片段类中使用,如下所示。

    val adapter= recyclerview.withFilteredAdapter(array, R.layout.list_item_2) { str ->
            itemView.tv.text = str}
    

    像下面这样开始过滤。

    override fun onQueryTextChange(newText: String?): Boolean {
                adapter.filter.filter(newText)
                return false
            }
    

    【讨论】:

    • 感谢@Azeem Haider,这对我很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    相关资源
    最近更新 更多