0 android filtering kotlin android-recyclerview
如何使用 Kotlin 扩展功能实现通用过滤适配器?。我是安卓新手。所以请一步一步指导我。
小智 5
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 }
Run Code Online (Sandbox Code Playgroud)
Step 2.
Create class BaseViewHolder.kt
class BaseViewHolder<in T>(parent: ViewGroup, @LayoutRes layoutId: Int) :
RecyclerView.ViewHolder(parent.inflater(layoutId))
Run Code Online (Sandbox Code Playgroud)
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()
}
}
}}
Run Code Online (Sandbox Code Playgroud)
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}
Run Code Online (Sandbox Code Playgroud)
Start filtering like below.
override fun onQueryTextChange(newText: String?): Boolean {
adapter.filter.filter(newText)
return false
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |