I am trying to add Swipe Refresh Layout to my fragment. I am using AsyncTaskLoader to load data. While setting the Refresh Layout's OnRefreshListener, I want to restart the loader to load new data (or else should I do different thing) but I can't handle the loaderCallBacks argument. It gives error if I use "this". It says "Found OnRefreshListener, Required LoaderManager.LoaderCallback" object. (I have my OnCreateLoader, OnLoadFinished and OnLoaderReset.)
Here is my code:
// class declaration
public class FragmentTopNews extends Fragment
implements LoaderManager.LoaderCallbacks<List<NewsItem>>, NewsAdapter.OnItemClickListener{
...
if(activeNetwork != null && activeNetwork.isConnected()){
LoaderManager loaderManager = getLoaderManager();
loaderManager.initLoader(NEWS_LOADER_ID, null,this);
}
// SwipeRefreshlayout for refreshing the data
mSwipeRefreshLayout = rootView.findViewById(R.id.srl_refresher);
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
mNewsAdapter.clearData();
mNewsAdapter.notifyDataSetChanged();
mSwipeRefreshLayout.setRefreshing(true);
// Here is the problem
getLoaderManager().restartLoader(NEWS_LOADER_ID, null, this);
}
});
My second question is "getloaderManager()" term is strike-through telling me that it is deprecated. What can I do for it?
For your first question:
When you set the listener, you made a new anonymous inner class instance of the OnRefreshListener
, which means this
is an instance of it, not your Fragment that's implementing LoaderCallbacks
.
Use FragmentTopNews.this
instead:
getLoaderManager().restartLoader(NEWS_LOADER_ID, null, FragmentTopNews.this);
For your second question:
android.app.Fragment
and its related classes have been deprecated in API 28. You're supposed to use the android.support.v4.app
versions instead. In other words, change your imports. You will have to also start using AppCompatActivity and getSupportFragmentManager()
.
EDIT:
Seems the support docs are outdated. I had to actually go to AOSP to find this, but Fragment#getLoaderManager()
is indeed deprecated. Use LoaderManager.getInstance(Fragment)
.