我考虑了使用AsyncTaskLoader和Fragment(
https://gist.github.com/codeswimmer/884591)的一些例子,我试图做同样的事情.但是现在我无法修复不兼容的类型错误 – 在onCreateLoader方法中.我不知道为什么会这样,因为我也做了同样的事情.
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"); } } }
解决方法
检查你的进口.确保你正在使用 android.support.v4.app.LoaderManager.LoaderCallbacks< d取代;代替 android.app.LoaderManager.LoaderCallbacks< d取代;在你的片段和android.support.v4.content.AsyncTaskLoader< D>在您的FeedLoader中