【问题标题】:Android Studio doesn't accept "this" as LoaderCallBack argument inside OnRefreshListenerAndroid Studio 不接受“this”作为 OnRefreshListener 中的 LoaderCallBack 参数
【发布时间】:2018-09-21 20:05:48
【问题描述】:

我正在尝试将滑动刷新布局添加到我的片段。我正在使用 AsyncTaskLoader 加载数据。在设置刷新布局的 OnRefreshListener 时,我想重新启动加载程序以加载新数据(否则我应该做不同的事情)但我无法处理 loaderCallBacks 参数。如果我使用“this”,它会出错。它说“找到 OnRefreshListener,需要 LoaderManager.LoaderCallback”对象。 (我有我的 OnCreateLoader、OnLoadFinished 和 OnLoaderReset。)

这是我的代码:

// class declaration
public class FragmentTopNews extends Fragment
    implements LoaderManager.LoaderCallbacks<List<NewsItem>>, NewsAdapter.OnItemClickListener{

...

if(activeNetwork != null && activeNetwork.isConnected()){
   LoaderManager loaderManager = getLoaderManager();
   loaderManager.initLoader(NEWS_LOADER_ID, null,this);
   } 

    // SwipeRefreshlayout for refreshing the data
    mSwipeRefreshLayout = rootView.findViewById(R.id.srl_refresher);
    mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            mNewsAdapter.clearData();
            mNewsAdapter.notifyDataSetChanged();
            mSwipeRefreshLayout.setRefreshing(true);
            // Here is the problem
            getLoaderManager().restartLoader(NEWS_LOADER_ID, null, this);
        }
    });

我的第二个问题是“getloaderManager()”这个术语是删除线告诉我它已被弃用。我能为它做些什么?

【问题讨论】:

    标签: android swiperefreshlayout android-loadermanager


    【解决方案1】:

    第一个问题:

    当您设置监听器时,您创建了OnRefreshListener 的一个新的匿名内部类实例,这意味着this 是它的一个实例,而不是实现LoaderCallbacks 的Fragment。

    改用FragmentTopNews.this

    getLoaderManager().restartLoader(NEWS_LOADER_ID, null, FragmentTopNews.this);
    

    第二个问题:

    android.app.Fragment 及其相关类在 API 28 中已被弃用。您应该改用android.support.v4.app 版本。换句话说,改变你的进口。您还必须开始使用 AppCompatActivity 和 getSupportFragmentManager()

    编辑:

    似乎支持文档已过时。我实际上必须去AOSP 才能找到它,但Fragment#getLoaderManager() 确实已被弃用。使用LoaderManager.getInstance(Fragment)

    【讨论】:

    • 感谢您的帮助。第一个问题解决了。谈到第二个,我已经使用了 v4 版本的库。 (import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager;) “开始使用AppCompatActivity”是什么意思?将片段扩展到它?我试过了,它给出了错误。
    • 你确定这个 Fragment 是支持 Fragment 吗? getLoaderManager() 在支持库中未被弃用。
    • 是的,我确定。这是开始。 ...导入android.support.v4.app.Fragment;导入android.support.v4.app.LoaderManager;导入 android.support.v4.widget.SwipeRefreshLayout;导入 android.support.v7.widget.LinearLayoutManager;导入 android.support.v7.widget.RecyclerView;导入 java.util.List; ... 公共类 FragmentTopNews 扩展 Fragment 实现 LoaderManager.LoaderCallbacks>, NewsAdapter.OnItemClickListener{
    • 不接受“片段”作为参数,需要(T 所有者)表达式。 LoaderManager.getInstance(Fragment).initLoader(NEWS_LOADER_ID, null,this);
    • @HüseyinŞahin Fragment 是参数类型。只要通过this
    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2018-02-08
    相关资源
    最近更新 更多