您的位置:首页 > 移动开发 > Android开发

Android实现根据用户输入自动搜索

2016-11-14 23:32 459 查看
最近App上线play商店,版本整来整去。下午闲暇之余,一位老友忽然扣我,心情一阵激动。我还以为是要送我中秋月饼,丫的,上来就稀里糊涂表明一堆需求。。。哇凉啊~

行了,今天我就和大家分享下关于这个突如其来的”中秋好礼”:

EditText实现自动搜索。自动搜索的含义就是:

当用户输入内容后,在一定的间隔时间内,如果用户没有继续输入则请求服务器查询结果。反之,则等待用户继续输入,直到用户停止后达到间隔时间请求服务器。

这种搜索的场景相信大家都见过也都用过,目前大部分App的搜索功能都是如此。典型的:JD,淘宝等等。。

此时,可能有哥们一脸蒙蔽了。该怎么去设计这个需求呢?有哥们会说,间隔时间,我可以用个Timer定时器,监听内容改变,然后开启定时器查询。。

这种方式太麻烦了,太不好控制了。既然是在间隔时间内根据用户输入控制请求,那么我们可以监听EditText的TextChange事件。间隔时间不就是延时任务吗,也许有朋友想到了,对的,用handler的postDelay来搞定。

实现思路:

(1)监听EditText的TextChange事件。

(2)onTextChanged方法中使用handler首先remove掉Runnable。(该Runnable即搜索的任务)

(3)然后调用handler的postDelay开启Runnable任务。

怎么理解呢?首先我们remove之前的Runnable是因为,如果用户在延时的时间内又一次输入搜索内容,此时上次开启的延时任务应该删除不执行,然后重新postDelay。这样就可以实现在延时的时间间隔内不去请求服务器,超过该时间间隔,即不会执行remove上次的任务,则postDelay的任务开启,即请求服务器执行搜索。

下面看核心代码:

/**

* @param charSequence 输入框中改变前的字符串信息

* @param start 输入框中改变前的字符串的起始位置

* @param count 输入框中改变前后的字符串改变数量一般为0

* @param after 输入框中改变后的字符串与起始位置的偏移量

*/

@Override

public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {

Log.e(getPackageName(),”—beforeTextChanged—”);

}

/**
* @param charSequence 输入框中改变后的字符串信息
* @param start 输入框中改变后的字符串的起始位置
* @param before 输入框中改变前的字符串的位置 默认为0
* @param count 输入框中改变后的一共输入字符串的数量
*/
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
Log.e(getPackageName(), "---onTextChanged---"+charSequence.length());
mHandler.removeCallbacks(mSearchTesk);
mHandler.postDelayed(mSearchTesk,500);
}

/**
* @param editable 输入结束呈现在输入框中的信息
*/
@Override
public void afterTextChanged(Editable editable) {
}

/**
* 搜索任务
*/
class SearchTask implements Runnable {

@Override
public void run() {
Log.e("---SearchTask---","开始查询");
}
}


上面代码很简单,上面的流程我们都分析了,就不再多说。细心的朋友会发现,当我们删除完后,EditText的内容为空时,还是会执行一次搜索查询。哪的问题呢?

我们将目光还转向onTextChanged方法,可以看到,就算内容为空时,还是会执行一次postDelay,当延时时间到后,还是会执行Runnable任务,所以我们将代码稍作修改:

if(charSequence.length() > 0) {

mHandler.removeCallbacks(mSearchTesk);

mHandler.postDelayed(mSearchTesk,500);

} else {
mHandler.removeCallbacks(mSearchTesk);
}


这样即在EditText的内容长度大于0时才去做执行任务的操作,else(等于0)时清除任务。完美实现!

好了,今天的内容就到这里了,虽然本篇博客内容不多,但浓缩才是精华嘛~~哈哈,有问题的朋友留言咯!

源码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息