当前位置: 首页 > 知识库问答 >
问题:

在textWatcher中搜索列表时EditText滞后

羊禄
2023-03-14
searchBox.addTextChangedListener(new TextWatcher() {

            @Override
            public void beforeTextChanged( CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(final CharSequence charSequence, int i, int i1, int i2) {
                ArrayList<ProductInformation> newList = new ArrayList<>();
                for (ProductInformation info : currentList)
                    if (info.getName().contains(charSequence))
                        newList.add(info);
                productListAdapter.setNewData(newList);

            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });

将此侦听器添加到我的edittext后,它在键入时会出现滞后。我猜问题是在列表中搜索(列表中有40到60个项目)。

我能做什么?

共有1个答案

柯默
2023-03-14

实时文本搜索对于更好的性能有一些要求:

要求

>

  • 您不应该立即开始搜索,因为用户键入的速度相当快,下一个结果会立即覆盖上一个结果。运行多个搜索进程,但只显示最后一个结果会浪费性能。

    private Timer mRequestDelayTimer;
    private TimerTask mSearchTask;
    
    @Override
    public void onTextChanged(final CharSequence query, int i, int i1, int i2) {
        if (mRequestDelayTimer != null)
            mRequestDelayTimer.cancel();
    
        // If you do a async search, stop it here
        stopSearch();
    
        mRequestDelayTimer = new Timer();
        mSearchTask = new TimerTask() {
            @Override
            public void run() {
                startSearch(query);
            }
        };
        mRequestDelayTimer.schedule(mSearchTask, 500);
    }
    
    private synchronized void startSearch(String query) {
        // This is not run in UI thread. Use activity.runOnUiThread if you want to update the UI
        // Call an AsyncTask to do an async search or run a sync loop search here
    
        //ArrayList<ProductInformation> newList = new ArrayList<>();
        //for (ProductInformation info : currentList)
        //    if (info.getName().contains(charSequence))
        //        newList.add(info);
        //productListAdapter.setNewData(newList);
    }
    

    解释

    如果输入的每个字符都在500ms以内,它就不会调用startSearch,因为计时器一直在延迟。

    如果用户Rest超过500ms,则startsearch将被调用离开UI线程。然后如果用户在搜索仍在进行时开始键入,则会取消。

    如果您在ArrayAdapter中执行搜索和更新结果,它内置了Filter进程,则可以通过重写GetFilter来自定义它。这个过滤器自动在后台运行,为每个字符输入做取消,非常方便。参考:android中自定义ArrayAdapter中的自定义getFilter

  •  类似资料:
    • 我正在使用此链接中的自定义日历。它可以工作,但除了当月之外,所有月份的日期都被灰色化了。我想显示所有的月份时,就像第二个截图。但是除了当月(即四月)以外的所有月份都是灰色的。谁能帮助我在显示每个月像第二个截图和不像第一个截图?

    • 问题内容: 我有点迷茫,无法做到最快。我有一大堆具有基本变量属性的对象(带有getters / setters方法),我需要在此列表中进行搜索以找到列表中与给定参数匹配的对象 我已经找到了如何进行常规列表搜索的方法,但是我需要进行搜索,例如搜索列表中每个对象的调用getName()的结果的值,并获取结果与我的输入匹配的对象。 如下所示,第三个参数是方法调用的结果,第二个是我要查找的结果。 任何建议

    • 问题内容: 假设我正在创建一个简单的类以类似于C样式的结构工作,只保存数据元素。我试图弄清楚如何在对象列表中搜索属性等于某个值的对象。下面是一个简单的示例,以说明我要执行的操作。 例如: 我将如何搜索myList列表以确定它是否包含n == 5的元素? 我一直在谷歌搜索和搜索Python文档,我想我可以通过列表理解来做到这一点,但是我不确定。我可能还要补充一点,我必须使用Python 2.4.3,

    • 我有两个清单,例如: 列表1:只有一个元素 列表2:有1000个对象 注意:矩阵是字符串集合(例如:abc,定义,ghi) 问题: 在列表1中只有1个元素,而在列表2中有1000个。我需要检查所有这1000个元素才能找到1个元素吗? 有没有更好的办法?

    • 问题内容: 用Python的方式搜索或操作排序序列是什么? 问题答案: 是标准库的一部分-您正在寻找这种东西吗?

    • 我正在尝试使用TextWatcher界面,以检测哪个EditText被更改了。我有一个使用10个EditTexts的活动,为每个文本使用10个TextWatchers看起来很奇怪。 有没有办法只使用一个TextWatcher,并在函数afterTextChanged中的可编辑项上使用switch语句?