EditText即时搜索,可限定时间工具类

来源:互联网 发布:js修改div背景颜色 编辑:程序博客网 时间:2024/05/01 01:17

  想必即时搜索大家都做过,一般都监听EditText字符串改变或者SearchView来实现。但有时候,我们不想让它

输入一个字符就请求一次,删除一个字符也请求一次,那样太频繁了那有什么好方法可以实现让它输入后过一秒(或

者自定义时间)再搜索吗?下面这个工具类可以帮到你。

public class RealTimeSearchUtil {    private static ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(10);    private static RealTimeSearchUtilLisetener mRealTimeSearchUtilLisetener;    private static MyHandler handler = new MyHandler();    /**     * 实时搜索数据,通过RealTimeSearchUtilLisetener接口操作     * @param newText 搜索的字符串     * @param time  过多久搜索      * @param realTimeSearchUtilLisetener     */    public static void sendRealTimeSearchMessage(String newText,int time, RealTimeSearchUtilLisetener realTimeSearchUtilLisetener){        showSearchTip(newText,time);        mRealTimeSearchUtilLisetener = realTimeSearchUtilLisetener;    }    public static void showSearchTip(String newText,int time) {        schedule(new SearchTipThread(newText), time);    }    public static ScheduledFuture<?> schedule(Runnable command, long delayTimeMills) {        return scheduledExecutor.schedule(command, delayTimeMills, TimeUnit.MILLISECONDS);    }    private static class SearchTipThread implements Runnable {        String newText;        protected SearchTipThread(String newText) {            this.newText = newText;        }        @Override        public void run() {            // keep only one thread to load current search tip, you can get data from network here            boolean flag = newText != null && newText.length() > 0;            if (flag) {                handler.sendMessage(handler.obtainMessage(1));//不能在子线程中在开启一个子线程            }        }    }    private static class MyHandler extends Handler {        @Override        public void handleMessage(Message msg) {            switch (msg.what) {                case 1:                    mRealTimeSearchUtilLisetener.handleUIMessage();                    break;            }        }    }    public interface RealTimeSearchUtilLisetener{        /**         * 此方法在主线程中执行,可以发送网络请求数据         */        void handleUIMessage();    }}

  如何使用?

etSearch.addTextChangedListener(textWatcher);
public TextWatcher textWatcher = new TextWatcher() {        @Override        public void beforeTextChanged(CharSequence s, int start, int count, int after) {        }        @Override        public void onTextChanged(final CharSequence s, int start, int before, int count) {                RealTimeSearchUtil.sendRealTimeSearchMessage(s.toString(),500, new RealTimeSearchUtil.RealTimeSearchUtilLisetener() {                    @Override                    public void handleUIMessage() {                      //发起请求                    }                });        }        @Override        public void afterTextChanged(Editable s) {        }    };

  欢迎Star,Thank You Github: https://github.com/LxzBUG/LimitedTimeSearchUtils

0 0
原创粉丝点击