Фильтруемый RecyclerView ожидает инициализации переменной - PullRequest
0 голосов
/ 07 декабря 2018

После попытки реализовать фильтруемую функциональность для моего 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 голосов
/ 07 декабря 2018

Для предупреждения, если вы поместите курсор в строку, которая выдает это предупреждение, и нажмете 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 { }, который больше не нужен.

...