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

最近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)时清除任务。完美实现!
好了,今天的内容就到这里了,虽然本篇博客内容不多,但浓缩才是精华嘛~~哈哈,有问题的朋友留言咯!
源码下载

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值