AutoCompleteTextView - 更新适配器时,下拉自动关闭
AutoCompleteTextView - when update adapter, dropdown auto close
我使用 MaterialAutoCompleteTextView,当我添加新项目并调用 notifyDataSetChanged() 时,下拉列表会自动关闭
如何解决这个问题
视频:
https://drive.google.com/file/d/1AYWW-_HcIpefrn0RcPMx2EsLLoyB2TtY/view?usp=sharing
代码:
class MainActivity : AppCompatActivity() {
private lateinit var materialAutoComplete: MaterialAutoCompleteTextView
private lateinit var adapter: CustomArrayAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
materialAutoComplete = findViewById(R.id.materialAutoComplete_main)
setupMaterialAutoComplete()
}
private var number = 0
private fun setupMaterialAutoComplete() {
val items = mutableListOf("Shop", "Shop", "Shop", "Shop")
adapter = CustomArrayAdapter(
this,
R.layout.item_goods_material_auto_complete,
items
)
materialAutoComplete.setAdapter(adapter)
object : CountDownTimer(3000, 1000) {
override fun onTick(millisUntilFinished: Long) {
}
override fun onFinish() {
number += 1
adapter.addAll(mutableListOf("$number", "${number + 1}"))
}
}.start()
}
}
只需覆盖此方法
class MaterialAutoCompleteTextViewWithoutAutoCloseDropdown : MaterialAutoCompleteTextView {
constructor(context: Context) : super(context)
constructor(context: Context, attributeSet: AttributeSet?) : super(context, attributeSet)
constructor(
context: Context, attributeSet: AttributeSet?, defStyleAttr: Int,
) : super(context, attributeSet, defStyleAttr)
override fun dismissDropDown() {
}
override fun onKeyPreIme(keyCode: Int, event: KeyEvent): Boolean {
if (keyCode == KeyEvent.KEYCODE_BACK && isPopupShowing) {
if (event.action == KeyEvent.ACTION_DOWN && event.repeatCount == 0) {
val state = keyDispatcherState
state?.startTracking(event, this)
return true
} else if (event.action == KeyEvent.ACTION_UP) {
val state = keyDispatcherState
state?.handleUpEvent(event)
if (event.isTracking && !event.isCanceled) {
super.dismissDropDown()
return true
}
}
}
return super.onKeyPreIme(keyCode, event)
}
override fun replaceText(text: CharSequence?) {
clearComposingText()
setText(text)
val spannable = getText()
Selection.setSelection(spannable, spannable.length)
super.dismissDropDown()
}
}
我使用 MaterialAutoCompleteTextView,当我添加新项目并调用 notifyDataSetChanged() 时,下拉列表会自动关闭
如何解决这个问题
视频: https://drive.google.com/file/d/1AYWW-_HcIpefrn0RcPMx2EsLLoyB2TtY/view?usp=sharing
代码:
class MainActivity : AppCompatActivity() {
private lateinit var materialAutoComplete: MaterialAutoCompleteTextView
private lateinit var adapter: CustomArrayAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
materialAutoComplete = findViewById(R.id.materialAutoComplete_main)
setupMaterialAutoComplete()
}
private var number = 0
private fun setupMaterialAutoComplete() {
val items = mutableListOf("Shop", "Shop", "Shop", "Shop")
adapter = CustomArrayAdapter(
this,
R.layout.item_goods_material_auto_complete,
items
)
materialAutoComplete.setAdapter(adapter)
object : CountDownTimer(3000, 1000) {
override fun onTick(millisUntilFinished: Long) {
}
override fun onFinish() {
number += 1
adapter.addAll(mutableListOf("$number", "${number + 1}"))
}
}.start()
}
}
只需覆盖此方法
class MaterialAutoCompleteTextViewWithoutAutoCloseDropdown : MaterialAutoCompleteTextView {
constructor(context: Context) : super(context)
constructor(context: Context, attributeSet: AttributeSet?) : super(context, attributeSet)
constructor(
context: Context, attributeSet: AttributeSet?, defStyleAttr: Int,
) : super(context, attributeSet, defStyleAttr)
override fun dismissDropDown() {
}
override fun onKeyPreIme(keyCode: Int, event: KeyEvent): Boolean {
if (keyCode == KeyEvent.KEYCODE_BACK && isPopupShowing) {
if (event.action == KeyEvent.ACTION_DOWN && event.repeatCount == 0) {
val state = keyDispatcherState
state?.startTracking(event, this)
return true
} else if (event.action == KeyEvent.ACTION_UP) {
val state = keyDispatcherState
state?.handleUpEvent(event)
if (event.isTracking && !event.isCanceled) {
super.dismissDropDown()
return true
}
}
}
return super.onKeyPreIme(keyCode, event)
}
override fun replaceText(text: CharSequence?) {
clearComposingText()
setText(text)
val spannable = getText()
Selection.setSelection(spannable, spannable.length)
super.dismissDropDown()
}
}