Android實現根據使用者輸入自動搜尋

奮鬥年輕人發表於2017-01-05

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)時清除任務。完美實現!

好了,今天的內容就到這裡了,雖然本篇部落格內容不多,但濃縮才是精華嘛~~哈哈,有問題的朋友留言咯!

原始碼下載


相關文章