Bind AutoComplete Text View в MVVM - PullRequest
0 голосов
/ 22 июня 2019

Я хочу связать свое автозаполнение текстового представления в шаблоне MVVM с пользовательским адаптером, но не уверен, как это сделать правильно. Я пробовал это как связывание с BindingAdapter, как будто я привязывал мой счетчик, но получал ошибку для своего фильтра. Это вызывает недопустимое исключение аргумента. Я думаю, что неправильно настраиваю адаптеры привязки. Любая помощь будет оценена.

<androidx.appcompat.widget.AppCompatAutoCompleteTextView
                    android:id="@+id/customerNameTextInputLayout"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="@string/customer_name"
                    android:imeOptions="actionSearch"
                    android:inputType="textAutoComplete|textAutoCorrect"
                    android:text="@={addSaleViewModel._customerName}"
                    android:selectedItemPosition="@={addSaleViewModel.selectedAutoComplete}"
                    app:partyAutoCompleteAdapter="@{addSaleViewModel.partyList}" />

Вот мой код адаптера

class PartyAutoCompleteAdapter(private var items: ArrayList<AddPartyRequest>?) :
    BaseAdapter(), PartyListItemViewModel.PartyListItemViewModelListener, Filterable {

    private var listFilter: ListFilter? = null
    private var dataListAllItems: ArrayList<AddPartyRequest> = ArrayList()

    override fun getCount(): Int = items!!.size

    override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
        return getView(position, convertView, parent)
    }

    override fun getItem(position: Int) = items?.get(position)

    override fun getItemId(position: Int) = items!!.get(position).partyId.toLong()

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {

        lateinit var partyHolder: PartyAutoCompleteHolder

        if (convertView == null) {
            val binding: RowPartyItemViewBinding = DataBindingUtil.inflate(
                LayoutInflater.from(parent.context),
                R.layout.row_party_item_view,
                parent,
                false
            )

            partyHolder = PartyAutoCompleteHolder(binding)
            partyHolder.view.tag = partyHolder
            binding.partyItemViewModel = PartyListItemViewModel(position, items?.get(position), this)
            binding.executePendingBindings()
        } else {
            partyHolder = convertView.tag as PartyAutoCompleteHolder
        }

        return partyHolder.view
    }

    inner class PartyAutoCompleteHolder(binding: RowPartyItemViewBinding) {
        val view = binding.root
    }

    fun addItems(parties: List<AddPartyRequest>) {
        items?.clear()
        items?.addAll(parties)
        dataListAllItems.clear()
        dataListAllItems.addAll(parties)
        notifyDataSetChanged()
    }

    override fun getFilter(): Filter? {
        if (listFilter == null) {
            listFilter = ListFilter()
        }
        return listFilter
    }

    inner class ListFilter : Filter() {

        override fun performFiltering(constraint: CharSequence?): Filter.FilterResults? {
            var constraint = constraint
            val results = Filter.FilterResults()

            if (constraint != null && constraint.isNotEmpty()) {
                constraint = constraint.toString().toUpperCase()

                val filters = ArrayList<AddPartyRequest>()

                if (dataListAllItems.size === 0) {

                    val groupsResponse = AddPartyRequest("", "", "", "", "", "", "", "", "", "", "")

                    filters.add(groupsResponse)

                } else {

                    for (i in 0 until dataListAllItems.size) {
                        if (dataListAllItems.get(i).partyName.toUpperCase().contains(constraint)) {

                            val groupsResponse = AddPartyRequest(
                                dataListAllItems.get(i).address,
                                dataListAllItems.get(i).asOfToday,
                                dataListAllItems.get(i).currentBalance,
                                dataListAllItems.get(i).email,
                                dataListAllItems.get(i).gstIn,
                                dataListAllItems.get(i).partyName,
                                dataListAllItems.get(i).partyType,
                                dataListAllItems.get(i).phoneNumber,
                                dataListAllItems.get(i).state,
                                dataListAllItems.get(i).userCompanyId,
                                dataListAllItems.get(i).partyId
                            )

                            filters.add(groupsResponse)

                        }
                    }

                }
                results.count = filters.size
                results.values = filters
            } else {
                results.count = dataListAllItems.size
                results.values = dataListAllItems
            }

            return results
        }

        override fun publishResults(constraint: CharSequence, results: Filter.FilterResults?) {
            items = results?.values as ArrayList<AddPartyRequest>
            notifyDataSetChanged()
        }

    }

    override fun onItemClick(view: View, position: Int) {

    }
}

Ошибка, с которой я сталкиваюсь в моем настраиваемом адаптере после ввода любого символа

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter constraint
        at in.diittech.diitvyapar.ui.adapter.PartyAutoCompleteAdapter$ListFilter.publishResults(Unknown Source:24)
        at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:282)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...