2014-03-06 35 views
1

我有一個執行進入一個動作條搜索基於一些查詢文本搜索的定製AsyncTaskLoader:刷新AsyncTaskLoader的查詢與OnQueryTextListener

class SearchLoader extends AsyncTaskLoader<List<String>> { 

    private static final String TAG = SearchLoader.class.getName(); 

    private List<String> data; 
    private String query; 
    private DataStore dataStore; 

    public SearchLoader(Context context, DataStore dataStore, String query) { 
     super(context); 
     this.dataStore = dataStore; 
     this.query = query; 
    } 

    @Override 
    public List<String> loadInBackground() { 
     try { 
      return dataStore.find(query); 
     } catch (SearchException e) { 
      Log.e(TAG, String.format("Error performing search, query: %s", query), e); 
     } 

     return null; 
    } 
} 

我已經迷上了一個OnQueryTextListener通過執行刷新加載的數據當查詢發生變化時重新搜索:

@Override 
public boolean onQueryTextChange(String newText) { 
    query = !TextUtils.isEmpty(newText) ? newText : null; 
    getLoaderManager().restartLoader(SEARCHRESULTS_LOADER, null, this); 
    return false; 
} 

我知道我需要調用getLoaderManager()。restartLoader。

但是,我不確定的是如何在加載器本身上設置新的查詢文本?

  1. 我沒有訪問加載器實例爲據我所知僅用於調用setter
  2. 的restartLoader的參數,如果一個新的Loader需要創建

推薦的方法是什麼?

回答

1

以我的經驗,restartLoader()導致onCreateLoader()被調用。我不知道爲什麼這會起作用,因爲它似乎與文件中關於重新使用現有裝載機的說法相反。你的代碼已經將保存的查詢實例變量傳遞給加載器構造函數,所以它應該做你想做的事情。

This Android sample來自Google顯示restartLoader()在查詢文本更改時被調用。

+1

對於這兩種方法,私有的LoaderManagerImpl類具有稍微不同的Javadoc註釋,這實際上更好地描述了發生了什麼。特別是,對於restartLoader(),它說:「調用來重新創建與特定ID關聯的Loader,如果當前有一個與此ID關聯的Loader,它將被視爲合適的取消/停止/銷燬。給定的參數將被創建並將其數據一次性傳送給您。「 – gnuf