AutoCompleteTextView(AppCompat)问题,而没有字符(Kotlin)



我正在使用 AutoCompleteTextView(AppCompat) by ArrayAdapter。当我键入一些字符时,我成功获得结果。但是当我删除此组件的第一个字符时,它会考虑过滤器中的空对象并给我空指针异常。

到目前为止我尝试过什么

  1. 从几个旧帖子中,我发现setThreshold可以解决,但它不起作用。
  2. 我自定义了AppCompat的AutoCompleteTextView类,并尝试处理replaceTextperformFiltering但它不起作用。
  3. 我尝试通过添加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
{
}
}
}
}
}

主要价值 :

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

崩溃日志

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)

请帮忙。即使是一些线索对我来说也是微不足道的。

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

约束:字符序列。 <-- 在此方法中定义为不可为空的字符序列。但是您提供一个空值作为字符序列。

可能会解决您的问题的是

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

只需在 CharSequence 后面添加一个 ?。现在,您定义了约束可能为 null

最新更新