[英]How to set nextFocus listener in Android AutoCompleteTextview widgets
[英]How to Set Multiple Click Listener to AutoCompleteTextView in Android?
我有一个AutoCompleteTextView ,当键入少数与其ArrayAdapter数据匹配的关键字时,将显示提示列表。
目前,我已经设置了AdapterView.OnItemClickListener,因此当用户单击提示时,屏幕上的软键盘将关闭。
我想要实现的目标:
我一直在搜索如何在自动完成上设置LongClickListener,但我在网上找不到任何解决方案。
我认为确保Click Listen能够获取提示的位置(在Int中)或文本数据(在String中)非常重要,因为我需要确定所选的数据是什么,我可以告诉数据库删除它。
我的问题:
如何为AutoCompleteTextView设置Long Click Listener ,它还将获得所选的提示位置?
我们欢迎任何其他有助于解决我想要实现的目标的解决方案,谢谢。
注意:我希望在选择提示时保留隐藏软键盘的功能。 我也接受Java语言答案 。
到目前为止我做了什么:
// Get an ArrayList<String> from database and declare to remarkList
val remarkList: ArrayList<String> = getDataFromDatabase()
// Set remarkList Data into ArrayAdapter
val adapter = ArrayAdapter(context!!, android.R.layout.simple_list_item_1, remarkList)
// Set ArrayAdapter to AutoCompleteTextView
autoComplete_remarks.setAdapter<ArrayAdapter<String>>(adapter)
// When click the hint selection, will trigger close keyboard function
autoComplete_remarks.onItemClickListener =
AdapterView.OnItemClickListener { _: AdapterView<*>, _: View, position: Int, _: Long ->
hideKeyboard(activity!!)
}
为了拥有多个单击侦听器,您应该使用自定义项布局构建自定义Adapter
。
class CustomAdapter(context: Context?, resource: Int) : ArrayAdapter<Data>(context, resource) {
private var mListener : IOnItemListener? = null
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View? {
var convertView = convertView
// Inflate layout
// Listeners
val textViewItem = convertView!!.findViewById(R.id.textViewItem) as TextView
textViewItem.setOnClickListener(View.OnClickListener {
mListener?.onClick(...)
})
textViewItem.setOnLongClickListener(View.OnLongClickListener {
mListener?.onLongClick(...)
})
return convertView;
}
fun setListener(listener: IOnItemListener) {
mListener = listener
}
interface IOnItemListener {
fun onClick(...)
fun onLongClick(...)
}
}
然后在其他地方打电话
val adapter : CustomAdapter = CustomAdapter(context, R.layout...)
adapter.setListener(object: IOnItemListener())
为AutoCompleteTextView创建了自定义适配器类,基本上这个自定义适配器,在getView
函数中将为每个将由AutoCompleteTextView
弹出的TextView
创建一个唯一的单独侦听器。
注意: AutoCompleteTextView
弹出的TextView
结果是可通过inner class ListFilter: Filter()
定制的inner class ListFilter: Filter()
和override fun publishResults(constraint: CharSequence?, results: FilterResults)
函数
自定义适配器类
class AutoCompleteTextViewCustomAdapter(context: Context, resource: Int, data: ArrayList<String>): ArrayAdapter<String>(context, resource) {
private var mListener: IOnItemListener? = null
private var dataList: List <String>? = data
private val listFilter = ListFilter()
private var dataListAllItems: List<String>? = null
override fun getView(position: Int, view: View? , parent: ViewGroup): View {
var adapterView = view
// using Custom XML View
if (adapterView == null) {
adapterView = LayoutInflater.from(parent.context)
.inflate(R.layout.list_row_text, parent, false)
}
val textView = adapterView!!.findViewById(R.id.textView) as TextView
textView.text = getItem(position)
// Custom OnClickListener Setup
textView.setOnLongClickListener {
mListener?.onLongClick("Pass Data")
true
}
// Custom OnClickListener Setup
textView.setOnClickListener {
mListener?.onSingleClick("Pass Data")
}
return adapterView
}
// Custom OnClickListener Setup
fun setListener(listener : IOnItemListener) {
mListener = listener
}
// Custom OnClickListener Setup that will be Called from the Activity/Fragment
interface IOnItemListener {
fun onLongClick(dataToBePass : String)
fun onSingleClick(dataToBePass : String)
}
// Custom Adapter Setup for AutoCompleteTextView
override fun getCount(): Int {
return dataList!!.size
}
override fun getItem(position: Int): String ? {
return dataList!![position]
}
override fun getFilter() : Filter {
return listFilter
}
inner class ListFilter: Filter() {
..// Filtering Logic
return results
}
override fun publishResults(constraint: CharSequence?, results: FilterResults) {
..// Filtering Logic
}
}
因此,当AutoCompleteTextView
弹出的每个TextView
为onClick或onLongClick时,将调用AutoCompleteTextViewCustomAdapter.IOnItemListener
的override方法来执行您想要的逻辑功能。
活性/片段
val adapter = AutoCompleteTextViewCustomAdapter(context!!, R.layout.list_row_text, dataList).also {
//Setup the OnClickListener what to perform when the TextView of the Adapter if being onClick
it.setListener(object : AutoCompleteTextViewCustomAdapter.IOnItemListener {
override fun onLongClick(dataReceived: String) {
// DO SOMETHING
}
override fun onSingleClick(dataReceived: String) {
// DO SOMETHING
}
})
}
// Set the adapter to the AutoCompleteTextView View that define in your XML File
autoCompleteTextView.setAdapter(adapter)
到目前为止,这个解决方案适用于我的场景,简而言之,对于AutoCompleteTextView有一个多点击监听器 ,我们不能使用默认适配器,因为它们只支持Single onClickListener,所以我们必须创建自定义适配器来自定义和设置所有ClickListener来支持多个onClick侦听器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.