如何在Android中为AutoCompleteTextView设置多点击监听器?
How to Set Multiple Click Listener to AutoCompleteTextView in Android?
我有一个 AutoCompleteTextView,当输入几个与其 ArrayAdapter 数据匹配的关键字时,它会显示一个提示列表。
目前,我设置了一个AdapterView.OnItemClickListener,所以当用户点击提示时,屏幕上的软键盘将关闭。
我想要达到的目标:
- 我想添加一个允许用户从数据库中删除提示数据的功能,所以我想为 AdapterView 添加另一个 ClickListener,例如 LongClickListener,所以当用户长按Hint时,会触发Dialog Pop Out提示用户确认删除。
我一直在寻找如何在自动完成上设置 LongClickListener,但是我在网上找不到任何解决方案。
我认为确保 Click Listen 能够获得 position(in Int) 或 很重要提示的文本数据(字符串),因为我需要确定选择的数据是什么,我可以告诉数据库删除它。
我的问题:
如何为 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!!)
}
为了拥有多个点击侦听器,您应该构建一个带有自定义项目布局的自定义 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 创建了自定义适配器 Class,基本上这个自定义适配器,在 getView
函数中将为将要弹出的每个 TextView
创建一个唯一的独立监听器通过 AutoCompleteTextView
.
注意: AutoCompleteTextView
弹出的 TextView
结果可通过 inner class ListFilter: Filter()
和 override fun publishResults(constraint: CharSequence?, results: FilterResults)
函数自定义
自定义适配器Class
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 方法 将是调用以执行您想要的逻辑功能。
Activity/Fragment
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 的多次点击侦听器,我们不能使用 默认适配器 因为它们只支持单个 onClickListener,所以我们必须创建自定义适配器来自定义和设置所有 ClickListener 以支持多个 onClick Listener。
我有一个 AutoCompleteTextView,当输入几个与其 ArrayAdapter 数据匹配的关键字时,它会显示一个提示列表。
目前,我设置了一个AdapterView.OnItemClickListener,所以当用户点击提示时,屏幕上的软键盘将关闭。
我想要达到的目标:
- 我想添加一个允许用户从数据库中删除提示数据的功能,所以我想为 AdapterView 添加另一个 ClickListener,例如 LongClickListener,所以当用户长按Hint时,会触发Dialog Pop Out提示用户确认删除。
我一直在寻找如何在自动完成上设置 LongClickListener,但是我在网上找不到任何解决方案。
我认为确保 Click Listen 能够获得 position(in Int) 或 很重要提示的文本数据(字符串),因为我需要确定选择的数据是什么,我可以告诉数据库删除它。
我的问题:
如何为 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!!)
}
为了拥有多个点击侦听器,您应该构建一个带有自定义项目布局的自定义 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 创建了自定义适配器 Class,基本上这个自定义适配器,在 getView
函数中将为将要弹出的每个 TextView
创建一个唯一的独立监听器通过 AutoCompleteTextView
.
注意: AutoCompleteTextView
弹出的 TextView
结果可通过 inner class ListFilter: Filter()
和 override fun publishResults(constraint: CharSequence?, results: FilterResults)
函数自定义
自定义适配器Class
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 方法 将是调用以执行您想要的逻辑功能。
Activity/Fragment
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 的多次点击侦听器,我们不能使用 默认适配器 因为它们只支持单个 onClickListener,所以我们必须创建自定义适配器来自定义和设置所有 ClickListener 以支持多个 onClick Listener。