2014-07-27 61 views
0

我有一個擴展ListFragment並實現LoaderManager.LoaderCallbacks的片段。在這個片段中,我有一個應該調用web服務並填充列表的按鈕。onCreateLoader()只調用一次

的問題是這種方法只被調用一次,僅在創建的片段,它會我叫每當我按下按鈕時:

@Override 
public Loader<List<ResultSearchUser>> onCreateLoader(int arg0, Bundle arg1) { 
    return new SearchUsersTask(getActivity(), page, size); 
} 

這裏是我的按鈕:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    ... 
    Button buttonSearchUsers = (Button) mLinearLayout 
      .findViewById(R.id.buttonSearchUsers); 
    buttonSearchUsers.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (user.getInterests() != null 
        && user.getInterests().size() > 0) { 
       page++; 
       getLoaderManager().initLoader(0, null, SearchFragment.this); 
      } 
     } 
    }); 
    .... 

爲什麼僅在創建片段時調用onCreatedLoader()?爲什麼onLoadFinished()方法每次按下按鈕都會調用?使用onLoadFinished()方法調用我的任務並填充列表的正確方法是什麼?

提前致謝。

回答

2

documentation

確保裝載機被初始化和激活。如果加載程序不存在,則創建一個加載程序(如果活動/碎片當前已啓動)將啓動加載程序。否則,重新使用最後創建的加載器。

換句話說,initLoader()只會觸發調用onCreateLoader()時尚未創建Loader。在隨後的通話中,Loader將被重複使用。

如果您需要強制銷燬/創建現有Loader,則應改爲撥打LoaderManager#restartLoader()

+0

明白了。那麼最佳做法是什麼?切換我的按鈕來調用我的任務,並使用回調來填充ListFragment?把「getLoaderManager()。restartLoader(0,null,SearchFragment.this);」 on button.setOnClickListener()聽起來像一個(壞)工作。 – placplacboom

+1

如果您只想重新執行'Loader'加載任務,則可以調用'Loader#forceLoad()'。 –