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

4
我有一个AutoCompleteTextView,当输入与其ArrayAdapter数据匹配的少量关键字时,它将显示提示列表。
目前,我已经设置了一个AdapterView.OnItemClickListener,所以当用户单击提示时,屏幕上的软键盘会关闭。
我的目标是:
我想添加一个功能,允许用户从数据库中删除提示的数据,因此我考虑为AdapterView添加另一个ClickListener,例如LongClickListener,因此当用户长按提示时,它将触发一个对话框弹出并提示用户进行删除确认。
我一直在搜索如何在自动完成上设置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!!)
                }
2个回答

1
为了拥有多个点击监听器,您应该构建一个带有自定义项布局的自定义适配器。
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(...)
    }
}

Then somewhere else, call

val adapter : CustomAdapter = CustomAdapter(context, R.layout...)
adapter.setListener(object: IOnItemListener()) 

0
已经为AutoCompleteTextView创建了自定义适配器类,基本上这个自定义适配器在getView函数中将为每个由AutoCompleteTextView弹出的TextView创建一个唯一的个体监听器。
注意:通过内部类ListFilter: Filter()和override fun publishResults(constraint: CharSequence?, results: FilterResults)函数,可以自定义AutoCompleteTextView弹出的TextView结果。
自定义适配器类
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被单击或长按时,AutoCompleteTextViewCustomAdapter.IOnItemListener中的覆盖方法将被调用以执行您所需的逻辑功能。

活动/片段

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,所以我们必须创建自定义适配器来自定义并 设置所有的点击监听器 以支持多个 onClick 监听器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接