繁体   English   中英

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

[英]How to Set Multiple Click Listener to AutoCompleteTextView in Android?

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

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

我想要实现的目标:

  • 我想添加一个允许用户从数据库中删除提示数据的功能,所以我想为AdapterView添加另一个ClickListener,LongClickListener ,所以当用户LongClick上提示时,它会触发一个Dialog Pop输出并提示用户删除确认。

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

为了拥有多个单击侦听器,您应该使用自定义项布局构建自定义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创建了自定义适配器类,基本上这个自定义适配器,在getView函数中将为每个将由AutoCompleteTextView弹出的TextView创建一个唯一的单独侦听器。

注意: AutoCompleteTextView弹出的TextView结果是可通过inner class ListFilter: Filter()定制的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
    }
}

因此,当AutoCompleteTextView弹出的每个TextView为onClick或onLongClick时,将调用AutoCompleteTextViewCustomAdapter.IOnItemListeneroverride方法来执行您想要的逻辑功能。

活性/片段

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有一个多点击监听器 ,我们不能使用默认适配器,因为它们只支持Single onClickListener,所以我们必须创建自定义适配器来自定义和设置所有ClickListener来支持多个onClick侦听器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM