2016-11-20 107 views
1

我正在使用AsyncTaskLoader將數據加載到來自HTTPRequest的ArrayList中。一旦加載,數據將通過回收站視圖顯示爲列表。當我點擊列表中的一個項目時,活動B被觸發,顯示該數據的詳細屏幕。然後,我有兩個選項可以回到列表中,一個是通過後退按鈕(電話),另一個是通過工具欄上的向上按鈕< -,因爲avtivity B具有android.support.PARENT_ACTIVITY實施。向上導航刷新加載器,但返回導航不

那麼,後退按鈕不會觸發加載程序,但上按鈕重新加載整個事情。到底是怎麼回事?我希望兩者行爲相同,即不要按照我在onStartLoading()中指定的方式重新加載。

這是我的AsynTask裝載機被稱爲像往常一樣,通過實現LoaderCallbacks<List<T>>接口

public class FallaLoader extends AsyncTaskLoader<List<Falla>> { 
private String mUrl; 
private List<Falla> mFalla; 

FallaLoader(Context context, String url) 
{ 
    super(context); 
    mUrl = url; 
} 
@Override 
protected void onStartLoading() 
{ 
    if (mFalla == null) { 
     // we have no data, so kick off loading 
     forceLoad(); 
    } 
    else { 
     // use cached data, fallas won't change for a year, so... just needed everytime I start 
     deliverResult(mFalla); 
    } 
} 

// This happens in the Background thread 
@Override 
public List<Falla> loadInBackground() 
{ 
    if (mUrl == null) 
    { 
     return null; 
    } 
    // Perform the network request, parse the response, and extract a list of earthquakes. 
    // pass the context since it will be needed to get the preferences 
    return Utils.fetchFallasData(mUrl, getContext()); 
} 

@Override 
public void deliverResult(List<Falla> data) 
{ 
    // We’ll save the data for later retrieval 
    mFalla = data; 
    super.deliverResult(data); 
}} 

在活動A的onCreate,我有呼叫到裝載機這樣

`LoaderManager loaderManager = getLoaderManager (); loaderManager.initLoader(0,null,this);

,然後,我實現接口:

@Override 
public Loader<List<Falla>> onCreateLoader(int i, Bundle bundle) 
{ 
    return new FallaLoader(this, F_URL); 
} 

@Override 
public void onLoadFinished(Loader<List<Falla>> loader, List<Falla> fallas) 
{ 
    View loadingIndicator = findViewById(R.id.loading_indicator); 
    loadingIndicator.setVisibility(View.GONE); 
    mEmptyStateTextView.setText(R.string.no_fallas); 

    if (fallas != null && !fallas.isEmpty()) 
    { 
     adapter.swap(fallas); 
    } 
} 

@Override 
public void onLoaderReset(Loader<List<Falla>> loader) { 

} 

`

謝謝!

+0

發佈您主要處理數據和返回按鈕的活動。 – mallaudin

回答

1

當你來自activity B回來,onStartLoading將再次被稱爲裝載機知道活動的states.Now當你按後退按鈕電話,活動將被簡單地帶到前面,但如果你按回退按鈕工具欄,先前的活動將再次創建,因此您的加載程序將被重新初始化和if (mFalla == null)將成爲真實的,導致致電forceLoad()

您可以在activity B中明確處理工具欄的後退按鈕,以避免此行爲。

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     if(item.getItemId() == android.R.id.home){ 
      onBackPressed(); 
     } 
     return true; 
    }