繁体   English   中英

如何删除 TextChangedListener?

[英]How to remove TextChangedListener?

我想使用 EditText 在数据库中搜索,然后将项目添加到 RecylerView。 现在我可以只搜索一个项目,项目显示,并且在更改编辑文本后它消失了,我希望它留下来,我希望我搜索的每个项目都自动添加到 RecyclerView。 所以我想我可以删除ChangeTextListener,然后再次添加它以搜索另一个项目,依此类推(?)

在 MainActivity.kt

fun Threads() {
        editText.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(
                s: CharSequence, start: Int,
                count: Int, after: Int
         ) {
            }

            override fun onTextChanged(
                s: CharSequence, start: Int,
                before: Int, count: Int
            ) {
                Thread {
//here we search for item
                    val itemsList = db?.costDAO()!!.getByName(s.toString())

                    runOnUiThread {
//here we pass item to Adapter constructor
                            recyclerView.adapter = MyAdapter(this@MainActivity, itemsList)
                            adapter.notifyDataSetChanged()

                    }
                }.start()
            }

            override fun afterTextChanged(s: Editable) { }

成本.DAO

@Dao
interface CostDAO {

    @Query("select * from cost where name like :name")
    fun getByName(name : String) : List<Cost>

罗伯特的回答是不正确的。 这将导致崩溃

java.lang.NullPointerException: Attempt to invoke interface method 'void android.text.TextWatcher.beforeTextChanged(java.lang.CharSequence, int, int, int)' on a null object reference

您不能使用匿名类,因为您需要存储它才能删除。

val textWatcher = object :TextWatcher {
                    override fun afterTextChanged(s: Editable?) {}

                    override fun beforeTextChanged(
                        s: CharSequence?,
                        start: Int,
                        count: Int,
                        after: Int
                    ) {}

                    override fun onTextChanged(
                        s: CharSequence?,
                        start: Int,
                        before: Int,
                        count: Int
                    ) {
                        //Do stuff
                    }

                }
binding.etEmail.addTextChangedWatcher(textWatcher)
// do what you need to do and later on
// ...
//
binding.etEmail.removeTextChangeWatcher(textWatcher)

从 editText 中删除 textWatcher 的唯一方法是将您分配的确切对象存储在某处,例如字段或列表中。

那么你也能

binding.editText.removeTextChangeWatcher(textWatcher)

或者,如果您使用多个 textWatcher,例如用于 recyclerView 项目,

textWatchers.forEach { vh.binding.editText.remoxeTextChangerWatcher(it) }

删除 textWatcher 的唯一选择是存储它的引用,否则将其传递给 remove 方法。

要删除侦听器,您必须将其设置为null 我知道您正在使用 Kotlin,但在 Java 中会是这样的:

editText.addTextChangedListener(null);

希望能帮助到你!

暂无
暂无

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

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