如何在Android中为AutoCompleteTextView设置多点击监听器?

How to Set Multiple Click Listener to AutoCompleteTextView in Android?

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

目前,我设置了一个AdapterView.OnItemClickListener,所以当用户点击提示时,屏幕上的软键盘将关闭。

我想要达到的目标:

我一直在寻找如何在自动完成上设置 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。