2016-06-29 8 views
6

Ho considerato alcuni esempi di lavoro con AsyncTaskLoader e Fragment (https://gist.github.com/codeswimmer/884591) e ho provato a fare lo stesso. Ma ora non riesco a correggere errori di tipi incompatibili - nel metodo onCreateLoader. Non ho idea del perché succede, perché ho fatto lo stesso.Tipi incompatibili nel metodo onCreateLoader che funziona con AsyncTaskLoader e 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 (nel caso)

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"); 
     } 

    } 
} 

risposta

6

Controlla le tue importazioni. Assicurati di utilizzare android.support.v4.app.LoaderManager.LoaderCallbacks<D> invece di android.app.LoaderManager.LoaderCallbacks<D> nel tuo frammento e android.support.v4.content.AsyncTaskLoader<D> nel tuo FeedLoader

+0

Magico! Funziona! Ma ancora non posso evitare di visualizzare l'aggiornamento dopo la rotazione dello schermo, ma è una domanda per un altro argomento. Grazie! –

+0

Solo per aggiungere qualche dettaglio - Usa "android.support.v4.content.AsyncTaskLoader" invece di importare "android.content.AsyncTaskLoader" –