我有一个 AutoCompleteTextView ,当键入一些与其ArrayAdapter数据匹配的关键字时,将显示提示列表。
当前,我已经设置了 AdapterView.OnItemClickListener ,因此,当用户单击“提示”时,屏幕上的软键盘将关闭。
我要实现的目标:
我一直在寻找如何在自动完成功能上设置LongClickListener,但是我在网上找不到任何解决方案。
我认为确保 Click Listen 能够获取位置(以Int表示)或文本数据(以String表示)非常重要提示,因为我需要确定要选择的数据是什么,我可以告诉数据库将其删除。
我的问题:
如何为AutoCompleteTextView设置长按侦听器,它也将获得选定的提示位置?
欢迎使用其他任何有助于解决我试图达到的目标的解决方案。
注意:选择“提示”时,我想保留隐藏软键盘的功能。我也接受 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!!)
}
答案 0 :(得分:1)
为了拥有多个点击侦听器,您应该使用自定义项目布局构建自定义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())
答案 1 :(得分:0)
已经为AutoCompleteTextView创建了自定义适配器类,基本上,此自定义适配器在getView
函数中将为将由{{1}弹出的每个TextView
创建一个唯一的个体侦听器}。
注意:通过AutoCompleteTextView
和TextView
函数可自定义AutoCompleteTextView
弹出的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
}
}
弹出的每个TextView
为onClick或onLongClick时,将调用AutoCompleteTextView
中的 override方法以执行逻辑功能您想要的。
活动/片段
AutoCompleteTextViewCustomAdapter.IOnItemListener
到目前为止,此解决方案适用于我的场景,简而言之,要为AutoCompleteTextView提供 Multiple Click Listener ,我们不能使用 Default Adapter ,因为它们仅支持Single onClickListener ,因此我们必须创建“自定义适配器”来自定义和设置所有ClickListener 以支持多个onClick Listener。