如何提高文本中搜索性能的变化Android

时间:2018-03-12 08:22:07

标签: android performance for-loop textwatcher

我有一个textWatcher来检测搜索栏中的文本更改。一旦发生文本更改,它将立即执行搜索操作。

例如,当我在搜索栏中输入“a”时,它会在for循环中运行itemData.name.toLowerCase().contains("a");以搜索名称包含“a”的项目并在循环视图中显示

然后我继续输入“b”,它会运行 再次在for循环中itemData.name.toLowerCase().contains("ab");搜索名称中包含“ab”的项目。

这是一个想法

//this will run when text change occur
for(){//for all item of itemlist
    if(){//if item name contains the text 
        //store this item in itemlist
    }
}
//update new itemlist to recycle view here

但是,性能非常慢。当我在搜索栏中输入时会有一些滞后。有人对此有解决方案吗?

1 个答案:

答案 0 :(得分:0)

在自动完成期间,您希望每次按键都会过滤结果。相反,您希望在完成输入后触发搜索。如果用户没有完成键入他的关键字,我们将使用键入的每个键执行搜索请求。

要避免这么多请求并优化搜索体验,您可以使用TextWatcher作为搜索字段EditText

private EditText searchText;  
private TextView resultText;  
private Timer timer;

    private TextWatcher searchTextWatcher = new TextWatcher() {  
        @Override
        public void afterTextChanged(Editable arg0) {
            // user typed: start the timer
            timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    // do your actual work here
                }
            }, 600); // 600ms delay before the timer executes the „run“ method from TimerTask
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            // nothing to do here
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // user is typing: reset already started timer (if existing)
            if (timer != null) {
                timer.cancel();
            }
        }
    };
  

这段代码只是向您展示了解决问题的示例用例   关于如何猜测用户何时完成打字并想要的问题   没有提交按钮就开始搜索。我们使用600延迟   毫秒开始搜索。如果用户键入另一个字母   在搜索字段中,我们重置计时器并等待另外600毫秒。