如何在Android中将多个Click侦听器设置为AutoCompleteTextView?

时间:2018-12-19 02:21:42

标签: android kotlin autocompletetextview onitemclicklistener onitemlongclicklistener

我有一个 AutoCompleteTextView ,当键入一些与其ArrayAdapter数据匹配的关键字时,将显示提示列表。

当前,我已经设置了 AdapterView.OnItemClickListener ,因此,当用户单击“提示”时,屏幕上的软键盘将关闭。

我要实现的目标:

  • 我想添加一个允许用户从数据库中删除提示数据的功能,因此我正在考虑为AdapterView 添加另一个ClickListener ,例如 LongClickListener strong>,因此当用户在提示上单击长按时,它将触发弹出对话框,并提示用户删除确认。

我一直在寻找如何在自动完成功能上设置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!!)
                }

2 个答案:

答案 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创建一个唯一的个体侦听器}。

注意:通过AutoCompleteTextViewTextView函数可自定义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。