EditText 搜索优化 | 安卓 offer 收割基

描述

设计一个 EditText 的文本监听器,停止输入 1s 后,如果文本发生变化则触发监听器。

例子:
文本内容是 111,111 -> 1111 -> 11111,连续输入都小于 1s,在输完后的 1s 触发监听器为 11111;
文本内容是 111,111 -> 1111 -> 111,连续输入都小于 1s,在输完后的 1s 不触发监听器;

类似微信的客户端搜索,不同的是微信在 111 -> 1111 -> 111 是会触发改变的。

效果如下所示,注意观察 title 文本的改变:

demo.gif

参考答案

代码很简单,结合注释参考即可,小功能从构思到编码到完成到优化,其实也是要花不少时间的,希望可以帮到你们哈。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class SearchEditText extends EditText {

private static final long LIMIT = 1000;

private OnTextChangedListener mListener;
private String mStartText = "";// 记录开始输入前的文本内容
private Runnable mAction = new Runnable() {
@Override
public void run() {
if (mListener != null) {
// 判断最终和开始前是否一致
if (!StringUtils.equals(mStartText, getText().toString())) {
mStartText = getText().toString();// 更新 mStartText
mListener.onTextChanged(mStartText);
}
}
}
};

public SearchEditText(Context context) {
super(context);
}

public SearchEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}

public SearchEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

/**
* 在 LIMIT 时间内连续输入不触发文本变化
*/
public void setOnTextChangedListener(OnTextChangedListener listener) {
mListener = listener;
}

@Override
protected void onTextChanged(final CharSequence text, int start, int lengthBefore, int lengthAfter) {
super.onTextChanged(text, start, lengthBefore, lengthAfter);
// 移除上一次的回调
removeCallbacks(mAction);
postDelayed(mAction, LIMIT);
}

@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
removeCallbacks(mAction);
}

public interface OnTextChangedListener {
void onTextChanged(String text);
}
}

结语

我正在打造一个帮助 Android 开发者们拿到更好 offer 的面试库————安卓 offer 收割基,欢迎 star,觉得不错的可以持续关注,有兴趣的可以一起加入进来和我一同打造。

打个小广告

欢迎加入我的小专栏「基你太美」一起学习。