title: How to get loaderManager.initLoader working within a fragment?
body: <p>I've made the changes suggested by the most kind kris larson, and I'm now not returning the right type from onCreateLoader</p>
  
  <pre><code>return new StoriesLoader(getContext(), uriBuilder.toString());
  </code></pre>
  
  <p>StoriesLoader:</p>
  
  <pre><code>import android.content.AsyncTaskLoader;
  import android.content.Context;
  
  import java.util.List;
  
  /**
   * Loads a list of news stories by using an AsyncTask to perform the
   * network request to the given URL.
   */
  public class StoriesLoader extends AsyncTaskLoader&lt;List&lt;NewsStory&gt;&gt; {
  
      /** Tag for log messages */
      private static final String LOG_TAG = StoriesLoader.class.getName();
  
      /** Query URL */
      private String mUrl;
  
      /**
       * Constructs a new {@link StoriesLoader}.
       *
       * @param context of the activity
       * @param url to load data from
       */
      public StoriesLoader(Context context, String url) {
          super(context);
          mUrl = url;
      }
  
      @Override
      protected void onStartLoading() {
          forceLoad();
      }
  
      /**
       * This is on a background thread.
       */
      @Override
      public List&lt;NewsStory&gt; loadInBackground() {
          if (mUrl == null) {
              return null;
          }
  
          // Perform the network request, parse the response, and extract a list of news stories.
          List&lt;NewsStory&gt; newsStories = QueryUtils.fetchNewsStoryData(mUrl);
          return newsStories;
      }
  }
  </code></pre>
  
  <p>I think I'm right to use an AsyncTaskLoader, but I don't get how to wrap / cast what is returned so it's a </p>
  
  <pre><code>Loader&lt;List&lt;NewsStory&gt;&gt;
  </code></pre>
  
  <p>Is my thinking wrong?  Do I have to ditch the AsyncTaskLoader?
  ~~~</p>
  
  <p>StoriesLoader returns List, from </p>
  
  <pre><code>    /**
   * This is on a background thread.
   */
  @Override
  public List&lt;NewsStory&gt; loadInBackground() {
      if (mUrl == null) {
          return null;
      }
  
      // Perform the network request, parse the response, and extract a list of earthquakes.
      List&lt;NewsStory&gt; newsStories = QueryUtils.fetchNewsStoryData(mUrl);
      return newsStories;
  }
  </code></pre>
  
  <p>I've tried these, to no avail:</p>
  
  <pre><code>return new Loader&lt;(new StoriesLoader(getContext(), uriBuilder.toString()))&gt;();
  return new Loader&lt;&gt;(new StoriesLoader(getContext(), uriBuilder.toString()));
  </code></pre>
  
  <p>If you're out there Kris, your corrections are well appreciated.</p>
  
  <p>~~~~~~~~~
  Studio is complaining </p>
  
  <blockquote>
    <p>Wrong 3rd argument type. Found:
    'com.newsreader.guardian.guardiantech.ListOfStoriesFragment',
    required:
    'android.support.v4.app.LoaderManager.LoaderCallbacks'</p>
  </blockquote>
  
  <p>When met with this</p>
  
  <pre><code>loaderManager.initLoader(mPage, null, this);
  </code></pre>
  
  <p>I believe it wants a way to reference the loader callbacks as the third parameter, it needs a map to where they are, is this right?</p>
  
  <p>I'm using the Loader in a fragment so that has derailed it.  I've tried changing the third parameter to getActivity(), getContext(), tried ListOfStoriesFragment, all to no avail.  </p>
  
  <p>The Fragment does implement the LoaderCallbacks interface - the callbacks are beneath it, so why doesn't it work?</p>
  
  <p>I tried Android Studio's suggested fixes.  Implement v4.app.LoadManager callbacks, but that broke a world of stuff.  </p>
  
  <p>How do I fix this?  Can I fix this by importing something different?<br>
  Apologies for the question.</p>
  
  <pre><code>import android.content.Context;
  import android.content.Intent;
  import android.content.Loader;
  import android.net.ConnectivityManager;
  import android.net.NetworkInfo;
  import android.net.Uri;
  import android.os.Bundle;
  import android.support.v4.app.Fragment;
  import android.support.v4.app.LoaderManager;
  import android.util.Log;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.AdapterView;
  import android.widget.ListView;
  import android.widget.TextView;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import static com.newsreader.guardian.guardiantech.BuildConfig.API_KEY;
  
  /**
   * Initiates a loader to get JSON from The Guardian
   * updates UI with info when the data has returned
   */
  
  public class ListOfStoriesFragment extends Fragment
          implements android.app.LoaderManager.LoaderCallbacks&lt;List&lt;NewsStory&gt;&gt; {
      /** String for tabs */
      public static final String ARG_PAGE = "ARG_PAGE";
      private int mPage;
  
      private static final String TAG = ListOfStoriesFragment.class.getName();
  
      /** URL for earthquake data from the USGS dataset */
      private static final String GUARDIAN_REQUEST_URL =
              "http://content.guardianapis.com/search";
  
      /**
       * Constant value for the news story loader ID. We can choose any integer.
       * This really only comes into play if you're using multiple loaders.
       */
      private static final int NEWSSTORY_LOADER_ID = 1;
  
      /** Adapter for the list of newsStories */
      private NewsStoryAdapter mAdapter;
  
      /** TextView that is displayed when the list is empty */
      private TextView mEmptyStateTextView;
  
      /** more tabs stuff */
      public static ListOfStoriesFragment newInstance(int page) {
          Bundle args = new Bundle();
          args.putInt(ARG_PAGE, page);
          ListOfStoriesFragment fragment = new ListOfStoriesFragment();
          fragment.setArguments(args);
          return fragment;
      }
      /** needed for tabs?! */
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          mPage = getArguments().getInt(ARG_PAGE);
      }
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
                               Bundle savedInstanceState) {
          View rootView = inflater.inflate(R.layout.fragment_stories, container, false);
  
          // Find a reference to the {@link ListView} in the layout
          ListView newsStoryListView = (ListView) rootView.findViewById(R.id.list);
  
          mEmptyStateTextView = (TextView) rootView.findViewById(R.id.empty_view);
          newsStoryListView.setEmptyView(mEmptyStateTextView);
  
          // Create a new adapter that takes an empty list of NewsStory as input
          mAdapter = new NewsStoryAdapter(getContext(), new ArrayList&lt;NewsStory&gt;());
  
          // Set the adapter on the {@link ListView}
          // so the list can be populated in the user interface
          newsStoryListView.setAdapter(mAdapter);
  
  
          // Get a reference to the ConnectivityManager to check state of network connectivity
          ConnectivityManager connMgr = (ConnectivityManager)
                  getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
  
          // Get details on the currently active default data network
          NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
  
          // If there is a network connection, fetch data
          if (networkInfo != null &amp;&amp; networkInfo.isConnected()) {
              // Get a reference to the LoaderManager, in order to interact with loaders.
              LoaderManager loaderManager = getLoaderManager();
  
              // Initialize the loader. Pass in the int ID constant defined above and pass in null for
              // the bundle. Pass in this activity for the LoaderCallbacks parameter (which is valid
              // because this activity implements the LoaderCallbacks interface).
              //loaderManager.initLoader(NEWSSTORY_LOADER_ID, null, this);
  
              // number the loaderManager with mPage as may be requesting up to three lots of JSON for each tab
              loaderManager.initLoader(mPage, null, this);
          } else {
              // Otherwise, display error
              // First, hide loading indicator so error message will be visible
              View loadingIndicator = rootView.findViewById(R.id.loading_indicator);
              loadingIndicator.setVisibility(View.GONE);
  
              // Update empty state with no connection error message
              mEmptyStateTextView.setText(R.string.no_internet_connection);
          }
  
          return rootView;
      }
  
      @Override
      public Loader&lt;List&lt;NewsStory&gt;&gt; onCreateLoader(int i, Bundle bundle) {
  
          String searchTerm;
          switch(mPage) {
              case 0:
                  searchTerm = "windows";
                  break;
              case 1:
                  searchTerm = "android";
                  break;
              default:
                  searchTerm = "android wear";
          }
  
          Uri baseUri = Uri.parse(GUARDIAN_REQUEST_URL);
          Uri.Builder uriBuilder = baseUri.buildUpon();
  
          uriBuilder.appendQueryParameter("q", searchTerm);
          uriBuilder.appendQueryParameter("api-key", API_KEY);
          uriBuilder.build();
  
          Log.wtf(TAG, uriBuilder.toString());
  
          return new StoriesLoader(getContext(), uriBuilder.toString());
      }
  
      @Override
      public void onLoadFinished(Loader&lt;List&lt;NewsStory&gt;&gt; loader, List&lt;NewsStory&gt; newsStories) {
          // Hide loading indicator because the data has been loaded
          View loadingIndicator = getView().findViewById(R.id.loading_indicator);
          loadingIndicator.setVisibility(View.GONE);
  
          // Set empty state text to display "No stories found."
          mEmptyStateTextView.setText(R.string.no_news_stories);
  
          // Clear the adapter of previous newsStories
          mAdapter.clear();
  
          // If there is a valid list of {@link NewsStory}s, then add them to the adapter's
          // data set. This will trigger the ListView to update.
          if (newsStories != null &amp;&amp; !newsStories.isEmpty()) {
              mAdapter.addAll(newsStories);
          }
      }
  
      @Override
      public void onLoaderReset(Loader&lt;List&lt;NewsStory&gt;&gt; loader) {
          // Loader reset, so we can clear out our existing data.
          mAdapter.clear();
      }
  
  
  }
  </code></pre>