【发布时间】:2021-06-28 02:59:35
【问题描述】:
如何使用 Kotlin 扩展功能实现通用过滤适配器?我是安卓新手。所以请一步步指导我。
【问题讨论】:
标签: android kotlin android-recyclerview filtering
如何使用 Kotlin 扩展功能实现通用过滤适配器?我是安卓新手。所以请一步步指导我。
【问题讨论】:
标签: android kotlin android-recyclerview filtering
第 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
}
【讨论】: