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)時清除任務。完美實現!
好了,今天的內容就到這裏了,雖然本篇博客內容不多,但濃縮纔是精華嘛~~哈哈,有問題的朋友留言咯!
源碼下載

發佈了97 篇原創文章 · 獲贊 20 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章