EditText即时搜索,可限定时间工具类
想必即时搜索大家都做过,一般都监听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: