Incompatible types in method onCreateLoader working with AsyncTaskLoader and Fragment

我只是一个虾纸丫 提交于 2019-12-01 02:33:12

问题


I considered some examples of working with AsyncTaskLoader and Fragment (https://gist.github.com/codeswimmer/884591) and I tried to do the same. But now I can't fix incompatible types error - in method onCreateLoader. I have no idea why it happens, because I have done the same.

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 (just in case)

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

    }
}

回答1:


Check your imports. Make sure you are using android.support.v4.app.LoaderManager.LoaderCallbacks<D> instead of android.app.LoaderManager.LoaderCallbacks<D> in your Fragment and android.support.v4.content.AsyncTaskLoader<D> in your FeedLoader



来源:https://stackoverflow.com/questions/38099873/incompatible-types-in-method-oncreateloader-working-with-asynctaskloader-and-fra

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!