Android實現根據使用者輸入自動搜尋
http://blog.csdn.net/u013718120/article/details/52442166
最近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)時清除任務。完美實現!
好了,今天的內容就到這裡了,雖然本篇部落格內容不多,但濃縮才是精華嘛~~哈哈,有問題的朋友留言咯!
相關文章
- 聯發科AI會根據輸入實時生成影像AI
- 【搜尋引擎】 PostgreSQL 10 實時全文檢索和分詞、相似搜尋、模糊匹配實現類似Google搜尋自動提示SQL分詞Go
- Oracle 實現多語言(即根據使用者登入的環境自適應本地語言)Oracle
- SAP S/4HANA Material Fiori應用根據擴充套件欄位搜尋的實現原理套件
- 實現動態自動匹配輸入的內容
- Android實現輸入手機號時自動新增空格Android
- Qt:透過QCompleter類提供的補全框completion box, 根據使用者輸入的內容提供可能的補全選項實現自動補全功能QT
- CSS 實現搜尋相關互動CSS
- webstorm根據.eslintrc檔案自動修復WebORMEsLint
- BIRT 中根據引數實現動態日期分組
- SAP Customer Data Cloud(Gigya)的使用者搜尋實現Cloud
- Vue中實現輸入框的自動補全功能Vue
- SpringBoot使用JPA根據實體類自動生成相應表-mysqlSpring BootMySql
- java使用jaxb解析XML(含根據xml自動生成實體類)JavaXML
- 【搜尋引擎】Solr Suggester 實現全文檢索功能-分詞和和自動提示Solr分詞
- 直播軟體開發,Android實現根據程式名殺死特定程式Android
- PHP根據資料表自動生成CURD操作PHP
- mybatis根據表逆向自動化生成程式碼MyBatis
- NOW直播Flutter動態搜尋列表頁實現Flutter
- 根據若依系統+minio實現批次下載附件並自動壓縮成zip
- 基於DataTables實現根據每個使用者動態顯示隱藏列,可排序排序
- 根據使用者的不同登入不同的頁面
- 輸入框/搜尋功能/新增、修改功能測試
- Laravel-admin 如何根據 select 的值實現動態 formLaravelORM
- realloc 實現隨使用者輸入自動擴充套件陣列長度(C語言)套件陣列C語言
- Android入門教程 | EditText 使用者輸入Android
- 利用FreeSql.Generator自動根據資料庫表動態生成實體類SQL資料庫
- Laravel + Elasticsearch 實現中文搜尋LaravelElasticsearch
- Jquery + Bootstrap 實現搜尋框jQueryboot
- Elasticsearch 實現簡單搜尋Elasticsearch
- 根據MediatR的Contract Messages自動生成Minimal WebApi介面WebAPI
- 最簡單的Qt程式:根據使用者所輸入圓半徑計算圓面積QT
- 根據業務能力實現DDD建模 - trond
- python根據字典內的值實現排序Python排序
- 爬蟲實現:根據IP地址反查域名爬蟲
- Vue Router根據後臺資料載入不同的元件(思考->實現->不止於實現)Vue元件
- 如何實現 Java SpringBoot 自動驗證入引數據的有效性JavaSpring Boot
- 根據使用者來獲取渠道
- 利用 Angular Directive 和 @HostBinding 實現輸入文字框隨著鍵盤輸入自動變色效果Angular