2017-06-02 55 views
0

一些背景信息: 我正在使用Activity> ParentFragment(Holds ViewPager)> Child fragments。 通過添加,刪除按鈕動態添加子片段。 我正在使用MVP體系結構AsyncTaskLoader在方向更改後未調用onFinishedLoad

實際問題: 在子片段中,我們使用通過演示者使用asynctaskloader填充的listview。

兒童片段:

//Initialize Views 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    root = inflater.inflate(R.layout.fragment_search_view_child, container, false); 

....... 

    mSearchViewPresenter= new SearchViewPresenter(
      getActivity(), 
      new GoogleSuggestLoader(getContext()), 
      getActivity().getLoaderManager(), 
      this, id 
    ); 

    SearchList list=new SearchList(); 
    //requestList from presenter 
    searchListAdapter =new SearchViewListAdapter(getActivity(), list, this); 
    listView.setAdapter(searchListAdapter); 

...... 

    return root; 
} 



@Override 
public void onResume(){ 
super.onResume(); 
    mSearchViewPresenter.start(); 
    searchBar.addTextChangedListener(textWatcher); 


} 

在演示者類,我們有:

public SearchViewPresenter(@NonNull Context context, @NonNull GoogleSuggestLoader googleloader,@NonNull LoaderManager loaderManager, 
           @NonNull SearchViewContract.View tasksView, @NonNull String id) { 
     // mLoader = checkNotNull(loader, "loader cannot be null!"); 
     mLoaderManager = checkNotNull(loaderManager, "loader manager cannot be null"); 
     // mTasksRepository = checkNotNull(tasksRepository, "tasksRepository cannot be null"); 
     mSearchView = checkNotNull(tasksView, "tasksView cannot be null!"); 

     mSearchView.setPresenter(this); 

     searchList=new SearchList(); 
     this.googleLoader=googleloader; 
     this.context=context; 
     this.id=loaderID; 
     // this.id=Integer.parseInt(id); 
    } 

    @Override 
    public void start() { 


     Log.d("start>initloader","log"); 
     mLoaderManager.restartLoader(1, null, this); 
    } 

    //TODO implement these when you are ready to use loader to cache local browsing history 


    @Override 
    public android.content.Loader<List<String>> onCreateLoader(int i, Bundle bundle) { 

     int loaderid=googleLoader.getId(); 
     Log.d("Loader: ", "created"); 
     googleLoader=new GoogleSuggestLoader(context); 
     googleLoader.setUrl(""); 
     googleLoader.setUrl(mSearchView.provideTextQuery()); 
     return googleLoader; 
    } 

    @Override 
    public void onLoadFinished(android.content.Loader<List<String>> loader, List<String> data) { 
     Log.d("Loader: ", "loadFinished"); 
     searchList.clear(); 
     for (int i = 0; i < data.size(); ++i) { 

      searchList.addListItem(data.get(i), null, LIST_TYPE_SEARCH, android.R.drawable.btn_plus); 
      Log.d("data Entry: ",i+ " is: "+searchList.getText(i)); 
     } 
     mSearchView.updateSearchList(searchList); 

    } 

    @Override 
    public void onLoaderReset(android.content.Loader<List<String>> loader) { 

    } 

另外,我們有在由一個的EditText框上的片段視圖正在編輯觸發演示此代碼。

@Override 
     public void notifyTextEntry() { 
      //DETERMINE HOW TO GIVE LIST HERE 
      // Dummy List 
      Log.d("notifyTextEntry","log"); 
      if(googleLoader==null)googleLoader=new GoogleSuggestLoader(context); 
       googleLoader.setUrl(mSearchView.provideTextQuery()); 
      // mLoaderManager.getLoader(id).abandon(); 


      mLoaderManager.getLoader(1).forceLoad(); 
      mLoaderManager.getLoader(1).onContentChanged(); 
      Log.d("length ", searchList.length().toString()); 
     // googleLoader.onContentChanged(); 
     } 

最後我們這裏有裝載機:

public class GoogleSuggestLoader extends AsyncTaskLoader<List<String>>{ 

    /** Query URL */ 
    private String mUrl; 
    private static final String BASE_URL="https://suggestqueries.google.com/complete/search?client=firefox&oe=utf-8&q="; 
    private List<String> suggestions =new ArrayList<>(); 


    public GoogleSuggestLoader(Context context) { 
     super(context); 
     this.mUrl=BASE_URL; 

    } 

    public void setUrl(String mUrl){ 
     this.mUrl=BASE_URL+mUrl; 
    }; 
    @Override 
    protected void onStartLoading() {forceLoad(); } 
    @Override 
    public List<String> loadInBackground() { 
     if (mUrl == null) { 
      return null; 
     } 

     try { 
      suggestions = new ArrayList<>(); 
      Log.d("notifyinsideLoader","log"); 
      String result=GoogleSuggestParser.parseTemp(mUrl); 
      if(result!=null) { 
       JSONArray json = new JSONArray(result); 
       if (json != null) { 
       JSONArray inner=new JSONArray((json.getString(1))); 
        if(inner!=null){ 
         for (int i = 0; i < inner.length(); ++i) { 
          //only show 3 results 
          if(i==3)break; 
          Log.d("notifyinsideLoader",inner.getString(i)); 
          suggestions.add(inner.getString(i)); 
         } 

        } 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return suggestions; 
    } 





} 

所以問題:

的代碼加載數據精對片段列表視圖。方向更改加載器未調用onLoadFinished時。我測試了加載程序,它正在處理數據。 我已經在主持人嘗試過forceload和onContentChanged無濟於事。 如果您需要了解更多信息,或者我只需要使用其他類似RxJava的信息,請告訴我。但我真的想要這個工作。 在你問我之前,我看到類似的問題,如:AsyncTaskLoader: onLoadFinished not called after orientation change但是我使用相同的ID,所以這個問題不應該存在。

+0

[查看此答案](https://stackoverflow.com/a/16525445/1496693)。你的活動正在重新創建,但你的裝載器不是。 – airowe

+0

好的。所以應該重新裝載裝載機,或者如果不是裝載機ID,我如何訪問舊的裝載機,因爲我相信我。 –

回答

0

答案就在這個頁面上AsyncTaskLoader doesn't call onLoadFinished 但是沒有提供詳細的信息來說明如何移動到這裏。 所以讓我來解釋一下這個問題的其他人。

支持庫是爲了片段。因此,負責回調的班級必須從支持庫中導入和實施正確的方法。就像您使用MVP一樣,您的演示者必須從支持loadermanager擴展。 例如:import android.support.v4.app.LoaderManager;然後實現正確的回調。

@Override 
    public android.support.v4.content.Loader<List<String>> onCreateLoader(int i, Bundle bundle) { 
... 
return new loader 
} 

@Override 
    public void onLoadFinished(android.support.v4.content.Loader<List<String>> loader, List<String> data) { 
//do something here to your UI with data 
} 

二:加載程序本身必須從支持將觸角延伸asynctaskloader。 例如:import android.support.v4.content.AsyncTaskLoader;

相關問題