2016-06-29 6 views
6

AsyncTaskLoaderとFragment(https://gist.github.com/codeswimmer/884591)で作業する例をいくつか考えてみましたが、同じことを試みました。しかし、互換性のない型のerror-inメソッドonCreateLoaderを修正することはできません。私は同じことをしたので、なぜそれが起こるのか分かりません。メソッドの互換性のない型onCreateLoader AsyncTaskLoaderとフラグメントを操作する

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(念のため)

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

    } 
} 

答えて

6

輸入品を確認してください。あなたのフラグメントに android.app.LoaderManager.LoaderCallbacks<D>の代わりに android.support.v4.app.LoaderManager.LoaderCallbacks<D>を使用し、FeedLoader

+0

Magicにandroid.support.v4.content.AsyncTaskLoader<D>を使用していることを確認してください。できます!しかし、まだ私は画面の回転後にビューの更新を避けることはできませんが、別のトピックの質問です。ありがとう! –

+0

詳細を追加する - "android.support.v4.content.AsyncTaskLoader"をimport "android.content.AsyncTaskLoader"の代わりに使用してください。 –

関連する問題