尝试为我的RecyclerView实现可过滤的功能后,我对哪种方法最好地解决此错误和警告感到困惑。
我已经考虑过使用它:
private var productListFull: List<Product> = ArrayList(productList)
但考虑到不同的属性,我不确定这是否正确
错误
productListFull
必须初始化
警告
private var productListFull: List<Product>
可以与作业一起加入
class MyListAdapter(private val mCtx: Context, private val productList: MutableList<Product>, private val mTwoPane: Boolean) : RecyclerView.Adapter<MyViewHolder>(), Filterable {
private var productListFull: List<Product>
private val productFilter = object : Filter() {
override fun performFiltering(constraint: CharSequence?): Filter.FilterResults {
val filteredList = ArrayList<Product>()
when {
constraint == null || constraint.isEmpty() -> filteredList.addAll(productListFull)
else -> {
val filterPattern = constraint.toString().toLowerCase().trim { it <= ' ' }
for (item in productListFull) {
when {
item.productName!!.toLowerCase().contains(filterPattern) -> filteredList.add(item)
}
}
}
}
val results = Filter.FilterResults()
results.values = filteredList
return results
}
override fun publishResults(constraint: CharSequence, results: Filter.FilterResults) {
productList.clear()
productList.addAll(results.values as List<Product>)
notifyDataSetChanged()
}
}
inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var textviewTitle: TextView = itemView.findViewById(R.id.listitem_title)
var textviewSubtitle: TextView = itemView.findViewById(R.id.listitem_subtitle)
}
init {
productListFull = ArrayList(productList)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val inflater = LayoutInflater.from(mCtx)
val v = inflater.inflate(R.layout.listitem, parent, false)
return MyViewHolder(v)
}
override fun getItemCount(): Int {
return productList.size
}
override fun getFilter(): Filter {
return productFilter
}
}
答案 0 :(得分:0)
对于警告,如果将光标放在发出此警告的行上并按Alt + Enter,将出现一个菜单,并且如果选择“加入声明和赋值” ,则会看到init { }
构造函数消失并且该行更改为此:
private var productListFull: List<Product> = ArrayList(productList)
表示init { }
构造函数内部的赋值,并带有声明。
这不是Java而不是Kotlin初始化列表的方式,您还应该将声明从List<Product>
更改为ArrayList<Product>
。但是您不需要。
您必须更改此行
private var productListFull: List<Product>
仅声明列表,但不初始化列表
对此:
private var productListFull = productList.toMutableList()
要将productList
的所有元素复制到productListFull
,现在您必须删除不再需要的init { }
构造函数。