Android Studio не принимает «this» в качестве аргумента LoaderCallBack внутри OnRefreshListener - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь добавить Swipe Refresh Layout к моему фрагменту.Я использую AsyncTaskLoader для загрузки данных.При настройке OnRefreshListener макета обновления я хочу перезапустить загрузчик для загрузки новых данных (или, если я сделаю что-то другое), но я не могу обработать аргумент loaderCallBacks.Это дает ошибку, если я использую «это».В нем говорится, что объект "Found OnRefreshListener, Required 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 ()» - термин зачеркнутый, говорящий мне, что этоосуждается.Что я могу для этого сделать?

1 Ответ

0 голосов
/ 21 сентября 2018

Для вашего первого вопроса:

Когда вы устанавливаете слушателя, вы создали новый анонимный внутренний экземпляр класса OnRefreshListener, что означает, что this является его экземпляром, а не вашим фрагментом, который реализуетLoaderCallbacks.

Вместо этого используйте 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).

...