getLoaderManager ().initLoader () не принимает "this" в качестве аргумента, хотя класс (ListFragment) реализует LoaderManager.LoaderCallbacks

у меня проблемы с выполнением руководство при использовании SQLite в Android. Я использую ListFragment вместо ListActivity(как в Примере), поэтому у меня есть ListFragment реализовать LoaderManager.LoaderCallbacks<Cursor> вместо. Затем, в fillData() метод ListFragment:

private void fillData() {
    // Fields from the database (projection)
    // Must include the _id column for the adapter to work
    String[] from = new String[] { NotesSQLiteHelper.COLUMN_TITLE };
    // Fields on the UI to which we map
    int[] to = new int[] { R.id.label };

    getLoaderManager().initLoader(0, null, this); //error
    adapter = new SimpleCursorAdapter(getApplicationContext(), R.layout.notes_row, null, from, to, 0);
    setListAdapter(adapter);
}

я получаю сообщение об ошибке:

The method initLoader(int, Bundle, LoaderManager.LoaderCallbacks<D>) in the type LoaderManager is not applicable for the arguments (int, null, NotesActivity.ArrayListFragment)

на отмеченной линии, хотя this осуществляет LoaderManager.LoaderCallbacks<Cursor>.

Спасибо за любые идеи.

14 ответов


вы не используете правильные реализации CursorLoader и Loader. Удалите старые импортные файлы и используйте следующие:

import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;

но у меня такая же проблема с использованием SherlockActionBar: Как я должен продлить SherlockListActivity нет метод getSupportLoadManager().

есть идеи по этому поводу?

EDIT: следуйте в этом уроке если вы не знаете, как использовать фрагменты. Создайте новый класс с расширением SherlockFragment и переместите туда логику отображения. Сделайте ваш старая активность расширить SherlockFragmentActivity и показать вновь созданный SherlockFragment. Так у меня получилось. Благодаря @JakeWharton!


несколько вещей, чтобы следить за (из моего недавнего опыта борьбы с этим):

  1. Если ваш minSDK установлен менее чем на 11 (т. е. уровень 10 для Gingerbread), и вы используете пакет поддержки для обратной совместимости, убедитесь, что вы используете

    getSupportLoaderManager().initLoader(LOADER_ID, null, this);
    
  2. вы упомянули об этом, когда сказали, что используете ListFragment, но он повторяет: Не расширяйте активность, иначе пакет поддержки не будет работать. Вместо этого расширьте Класс FragmentActivity или класс ListFragment.

  3. для импорта убедитесь, что вы используете правильные версии, если ваш minSDK

     android.support.v4.app.FragmentActivity;
     android.support.v4.app.LoaderManager;
     android.support.v4.content.Loader;
    

надеюсь, это поможет вам... или хотя бы кто-то другой...


приведение третьего аргумента решило проблему в моем случае:

С

 getLoaderManager().initLoader(0, null, this);

до

 getLoaderManager().initLoader(0, null, (android.app.LoaderManager.LoaderCallbacks<Cursor>) this);

Примечание:

  1. minSdk был 8, и я использовал библиотеку поддержки v4.
  2. (android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>) this) не работать.
  3. getSupportLoaderManager() or getSupportLoadManager() не работать.
  4. этот код был внутри активности не фрагмент

уже поздно, но, может быть, помочь кому-то.
если вы используете loader maneger во фрагменте, и вы min api ниже HONEYCOMB
ты должна использовать этот импорт

import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;      
import android.support.v4.app.Fragment;

и для запуска загрузчика используйте этот код

getActivity().getSupportLoaderManager().initLoader(/loader stuff*/);

надеюсь, это поможет кому-то.


измените импорт на

import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;

и использовать

getSupportLoaderManager().initLoader(0, null, this);

моя ошибка была из-за этого:

//import android.app.ListFragment; Error when doesnt import from support.v4
import android.support.v4.app.ListFragment;

в моем случае я должен был расширить свою активность ActionBarActivity с android.поддержка.В7.пакет приложений. Тогда я смог использовать

getSupportLoaderManager ().initLoader (0, null, this);


Я использую ActionBarSherlock с моим приложением, и я также столкнулся с этой проблемой и проработал все шаги, обсуждаемые другими в этом вопросе. Однако у меня по-прежнему была та же проблема после того, как я попробовал все предложенные резолюции.

The method initLoader(int, Bundle, LoaderManager.LoaderCallbacks<D>) in the type LoaderManager is not applicable for the arguments (int, null, this)
// Creates a new loader after the initLoader () call
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
  // do work
  return null;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
  adapter.swapCursor(data);
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
  // data is not available anymore, delete reference
  adapter.swapCursor(null);
}

У меня была аналогичная проблема, когда мой AsyncTaskLoader не возвращал мой список, но мое решение состояло в том, чтобы изменить вызов .initLoader to .restartLoader.

Я никогда называется .initLoader и сразу же позвонил .restartLoader.

У меня был слушатель onListItemClick в моем фрагменте и каждый раз выходил из фрагмента и перезагружал onListItemClick и переходил через приложение, которое он продолжал сбой.

Это может просто будьте специфичны для моего приложения, но, надеюсь,это поможет другим, если у них есть проблемы с перезагрузкой фрагмента.

Это было частью части файлового менеджера в моем приложении, поэтому он специфичен для нажатия нескольких onListItemClicks в загружаемом фрагменте.


Я обошел это, используя SherlockListFragment (или вы можете использовать ListFragment, я полагаю), но он содержится в Activity. Сначала я создал общий класс FragmentHolderActivity, который выглядит так:

FragmentHolderActivity.java

public class FragmentHolderActivity extends SherlockFragmentActivity {

    public static final String FRAGMENT_LAYOUT_RESOURCE_ID = "fragment_layout_resource_id";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Integer fragmentLayoutResourceId = getIntent().getIntExtra(FRAGMENT_LAYOUT_RESOURCE_ID, Integer.MAX_VALUE);
        Assert.assertNotSame(fragmentLayoutResourceId, Integer.MAX_VALUE);

        setContentView(fragmentLayoutResourceId);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                return false;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

}

затем вам нужно создать XML-файл для вашего фрагмента.

your_list_fragment.в XML

<?xml version="1.0" encoding="utf-8"?>
<fragment
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:name="com.example.YourListFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/fragment" />

и вот код, который вы используете для запуска фрагмент:

    Intent intent = new Intent();
    intent.setClass(this, FragmentHolderActivity.class);
    intent.putExtra(FragmentHolderActivity.FRAGMENT_LAYOUT_RESOURCE_ID, R.layout.your_list_fragment);
    startActivity(intent);

вы просто скажите FragmentHolderActivity использовать макет your_list_fragment, который в свою очередь загружает YourListFragment.java

затем вы можете использовать: getSherlockActivity().getSupportLoaderManager().initLoader(...) В YourListFragment.java

не уверен, что это правильно подход, но он держит всю мою логику в фрагментах, что приятно.


столкнулся с той же проблемой. Моя minSdkVersion-14, поэтому не может использовать android.поддержка.пакет В4.

Я понял это, расширив LoaderCallbacks вместо LoaderManager.LoaderCallbacks и использовать эти пакеты

import android.app.LoaderManager.LoaderCallbacks;  
import android.content.CursorLoader;  
import android.database.Cursor;  
import android.widget.SimpleCursorAdapter;

Если вы пробовали все вышеперечисленные методы и по-прежнему сталкиваетесь с той же ошибкой с параметром "this", выполните следующие действия :

  1. перейдите в настройки и включите опцию импорта на лету.(по умолчанию это быть включен, и вы можете сделать это с помощью клавиш Alt + Enter).

  2. вырезать весь код действия, которое было реализовано
    LoaderCallback... и вставьте его в текстовый редактор.

  3. затем, наконец, скопировать весь код этого действия из текстового редактора где вы вставили, без каких-либо команд импорта.( Только код класс / деятельность).

  4. вы получите много ошибок, поскольку вы еще ничего не импортировали. Просто нажмите Alt + Enter, где вы получаете ошибки, и это библиотеки будут импортированы автоматически. Примечание: выберите android.приложение... библиотека для CursorLoaders.


попробуйте эти 2 строки, это будет работать

android.support.v4.app.LoaderManager loaderManager = getSupportLoaderManager();

loaderManager.initLoader(LOADER_ID, null,  this);

Я использую minSDK 27 и имел эту же проблему, я попытался бросить, как @Dexter предложить, но это дало ошибку, сказав cannot be cast to android.app.LoaderManager$LoaderCallbacks, поэтому я попытался использовать различные операторы импорта, и это сработало. Я прокомментировал v4 версии, и это то, что у меня есть сейчас, и приложение работает:

//import android.support.v4.app.LoaderManager;
import android.app.LoaderManager;
import android.support.v4.app.NavUtils;
//import android.support.v4.content.CursorLoader;
import android.content.CursorLoader;
//import android.support.v4.content.Loader;
//import android.content.Loader;

не совсем уверен, когда/как v4 версии были импортированы.