与AsyncTaskLoader和Fragment一起使用的onCreateLoader方法中的类型不兼容 [英] Incompatible types in method onCreateLoader working with AsyncTaskLoader and Fragment

查看:85
本文介绍了与AsyncTaskLoader和Fragment一起使用的onCreateLoader方法中的类型不兼容的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我考虑了一些使用AsyncTaskLoader和Fragment的示例( https://gist.github.com/codeswimmer/884591 ),而我尝试执行相同的操作.但是现在我无法修复不兼容的类型错误-在onCreateLoader方法中.我不知道为什么会这样,因为我做了同样的事情.

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 (以防万一)

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>,在FeedLoader

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

这篇关于与AsyncTaskLoader和Fragment一起使用的onCreateLoader方法中的类型不兼容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆