可过滤的RecyclerView期望变量初始化

时间:2018-12-07 00:22:31

标签: android kotlin android-recyclerview android-adapter listadapter

尝试为我的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
    }
}

1 个答案:

答案 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 { }构造函数。