2016-06-29 5 views
6

Ich betrachtete einige Beispiele für die Arbeit mit AsyncTaskLoader und Fragment (https://gist.github.com/codeswimmer/884591) und ich habe versucht, das gleiche zu tun. Aber jetzt kann ich nicht inkompatible Typen Fehler beheben - in der Methode onCreateLoader. Ich habe keine Ahnung, warum es passiert, weil ich das gleiche getan habe.Inkompatible Typen in der Methode onCreateLoader arbeiten mit AsyncTaskLoader und Fragment

FeedLoader.java

public class FeedLoader extends AsyncTaskLoader<ArrayList<RSSItemData>> { 

    ArrayList<RSSItemData> listData; 
    Context ctx; 
    RSSItemData rssItem; 
    final Integer HTTP_CONNECTION_TIMEOUT = 15; 
    DBHelper dbHelper; 


    public FeedLoader(Context context) { 
     super(context); 
     this.ctx = context; 
     dbHelper = new DBHelper(ctx); 
    } 


    @Override 
    public ArrayList<RSSItemData> loadInBackground() { 

     listData = new ArrayList<RSSItemData>(); 

     if(!BaseUtils.isNetworkAvailable(ctx)) return getNewsFromDB(); 

     if(doWeHaveAnyNews()){ 

      Log.d("myLogs", "We have news!"); 

      String data = JSONUtils.getJSON("http://I-changed-URL.com", HTTP_CONNECTION_TIMEOUT*1000, ctx); 
      JSONResult result = new Gson().fromJson(data, JSONResult.class); 
      listData = result.items; 

      deleteAllNewsFromDB(); 
      putNewsIntoDB(listData); 

     } 
     else{ 

      Log.d("myLogs", "No news, retrieve from database"); 
      listData = getNewsFromDB(); 

     } 

     Log.d("myLogs", "Size of listData - " + listData.size()); 

     return listData; 
    } 

    public boolean doWeHaveAnyNews() {...} 
    public void putNewsIntoDB(ArrayList<RSSItemData> listData) {...} 
    public void deleteAllNewsFromDB() {...} 
    public ArrayList<RSSItemData> getNewsFromDB() {...} 

} 

RetrieveFeedFragment.java

public class RetrieveFeedFragment extends Fragment implements LoaderManager.LoaderCallbacks<ArrayList<RSSItemData>> { 

    private RecyclerView rvNews; 
    LinearLayout progBarLinearLayout; 
    ProgressBar progBar; 
    TextView progBarText; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 

     getActivity().getSupportLoaderManager().initLoader(0, null, this).forceLoad(); 

     Log.d("myLogs", "Fragment onCreate"); 
    } 

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

     Log.d("myLogs", "Fragment onCreateView"); 

     View v = inflater.inflate(R.layout.news_list_fragment, null); 

     rvNews = (RecyclerView) v.findViewById(R.id.listViewNews); 
     LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
     rvNews.setLayoutManager(llm); 
     rvNews.setHasFixedSize(true); 

     rvNews = (RecyclerView) v.findViewById(R.id.listViewNews); 

     progBarLinearLayout = (LinearLayout) v.findViewById(R.id.progressBarLinearLayout); 
     progBar = (ProgressBar) v.findViewById(R.id.progressBar); 
     progBarText = (TextView) v.findViewById(R.id.progressBarText); 

     return v; 

    } 


    @Override 
    public Loader<ArrayList<RSSItemData>> onCreateLoader(int id, Bundle args) { 
     return new FeedLoader(getActivity()); 
     /* Incompatible types ERROR 
     Required - anroid.support.v4.content.Loader <java.util.ArrayList<com.project.myproject.RetrieveFeed.RSSItemData>> 
     Found - com.project.myproject.RetrieveFeed.FeedLoader 
     */ 
    } 

    @Override 
    public void onLoadFinished(Loader<ArrayList<RSSItemData>> loader, ArrayList<RSSItemData> listData) { 
     // RSSAdapter = new RSSAdapter(listData, getActivity()); 
     // rvNews.setAdapter(RSSAdapter); 
     // progBarLinearLayout.setVisibility(LinearLayout.GONE); 
     Log.d("myLogs", "onLoadFinished"); 
    } 
    @Override 
    public void onLoaderReset(Loader<ArrayList<RSSItemData>> loader) { 
     Log.d("myLogs", "onLoaderReset"); 
    } 
} 

MainActivity.java (für alle Fälle)

public class MainActivity extends FragmentActivity { 

    RetrieveFeedFragment fragment;; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if(savedInstanceState == null){ 
      fragment = new RetrieveFeedFragment(); 
      getSupportFragmentManager().beginTransaction().add(R.id.fragment_news, fragment, "retrieve_feed_tag").commit(); 
      Log.d("myLogs", "New Fragment in Activity"); 
     } 
     else{ 
      fragment = (RetrieveFeedFragment) getSupportFragmentManager().findFragmentByTag("retrieve_feed_tag"); 
      Log.d("myLogs", "Get old Fragment by tag in Activity"); 
     } 

    } 
} 

Antwort

6

Überprüfen Sie Ihre Importe. Stellen Sie sicher, dass Sie android.support.v4.app.LoaderManager.LoaderCallbacks<D> anstelle von android.app.LoaderManager.LoaderCallbacks<D> in Ihrem Fragment und android.support.v4.content.AsyncTaskLoader<D> in Ihrem FeedLoader

+0

Magic verwenden! Es klappt! Aber ich kann nicht vermeiden, dass die Ansicht nach der Bildschirmdrehung aktualisiert wird, aber es ist eine Frage für ein anderes Thema. Vielen Dank! –

+0

Nur um einige Details hinzuzufügen - Verwenden Sie "android.support.v4.content.AsyncTaskLoader" anstelle des Imports "android.content.AsyncTaskLoader" –