AutoCompleteTextView (AppCompat) проблема, когда нет символа (Kotlin) - PullRequest
0 голосов
/ 04 июня 2019

Я использую AutoCompleteTextView (AppCompat) от ArrayAdapter.Я получаю результат успешно, когда набираю какой-то символ.Но когда я удаляю первый символ этого компонента, он рассматривает нулевой объект в фильтре и дает мне исключение нулевого указателя.

То, что я пробовал до сих пор

  1. ИзВ нескольких старых постах я обнаружил, что setThreshold может быть решением, но оно не работает.
  2. Я настроил класс AppCompat AutoCompleteTextView и пытаюсь обработать replaceText и performFiltering, но он не работает.
  3. Я пытаюсь ограничить возврат на 1-й символ, добавляя setOnKeyListener, но он не вызывается, потому что он полностью контролируется классом Filter после некоторого результата в кеше.
  4. Настройка класса android.widget.filter, но егоне разрешено ОС, так как ее использование ОС Android запрещено из пакета.

Код:

class MyAutoCompleteTextView(context: Context?, attrs: AttributeSet?) : AppCompatAutoCompleteTextView(context, attrs) {

    override fun replaceText(text: CharSequence?) {
        super.replaceText("")
    }

    override fun performFiltering(text: CharSequence?, keyCode: Int) {
        super.performFiltering("", keyCode)
    }
}

XML:

<com.spec.trailapp.utils.taglibs.MyAutoCompleteTextView
    android:id="@+id/autocomplTagged"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_margin="10dp"
    android:inputType="text"
    android:textCursorDrawable="@drawable/color_cursor"
    android:background="@null"
    android:completionThreshold="1"

    android:fontFamily="@font/brandotextlight"
    android:hint="@string/txt_who_did_you_go_with"
    android:textColorHint="@color/itinerary_title_txt_color"
    android:textColor="@color/colorBlack"
    android:maxLines="1"/>

Адаптер

class AutoSuggestAdapter(@NonNull context: Context, resource: Int) : ArrayAdapter<String>(context, resource),
    Filterable {
        private val mlistData: MutableList<String>
        var alLocalresult: ArrayList<ResultItem?> = ArrayList<ResultItem?>()

        init {
            mlistData = ArrayList()
        }

        fun setData(result: ArrayList<ResultItem>) {
            /*mlistData.clear()
            mlistData.addAll(list)*/

            if (result != null) {
                this.alLocalresult.addAll(result)
            }
        }

        override fun getCount(): Int {
            if(alLocalresult==null)
            {
                return 0
            } else
                return alLocalresult.size
        }

        override fun getItem(position: Int): String {
            return alLocalresult.get(position)?.firstName + " " + alLocalresult.get(position)?.lastName
            // return result
        }

        /**
         * Used to Return the full object directly from adapter.
         *
         * @param position
         * @return
         */
        /*fun getObject(position: Int): String {
            return mlistData[position]
        }*/

        @NonNull
        override fun getFilter(): Filter {
            return object : Filter() {
                protected override fun performFiltering(constraint: CharSequence?): FilterResults {
                    val filterResults = FilterResults()
                    if (constraint != null) {
                        filterResults.values = alLocalresult
                        filterResults.count = alLocalresult.size

                    }
                    return filterResults
                }

                protected override fun publishResults(constraint: CharSequence, results: FilterResults?) {
                    if (results != null && results!!.count > 0) {
                        notifyDataSetChanged()
                    } else
                    {
                    }
                }
            }
        }
    }

MainAvtiv:

var autoSuggestAdapter = AutoSuggestAdapter(
    this,
    android.R.layout.simple_dropdown_item_1line
)
autocomplTagged.setThreshold(1)
autocomplTagged.setAdapter(autoSuggestAdapter)
autoSuggestAdapter.setData(frindslist.data!!.result!!)

Crash Log

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter constraint
        at com.spec.trailapp.utils.taglibs.AutoSuggestAdapter$getFilter$1.publishResults(AutoSuggestAdapter.kt)
        at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:282)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6123)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)

Пожалуйста, помогите в этом.Даже какая-то подсказка будет прекрасной для меня.

1 Ответ

1 голос
/ 04 июня 2019
protected override fun publishResults(constraint: CharSequence, results: FilterResults?) {
                    if (results != null && results!!.count > 0) {
                        notifyDataSetChanged()
                    } else
                    {
                    }
                }

ограничение: CharSequence.<- в этом методе определяется как ненулевое значение CharSequence.Но вы предоставляете нулевое значение как CharSequence.</p>

Что, вероятно, решит вашу проблему:

protected override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
                    if (results != null && results!!.count > 0) {
                        notifyDataSetChanged()
                    } else
                    {
                    }
    }

Просто добавьте?за CharSequence.Теперь вы определили, что ограничение может быть нулевым

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...