У меня возникли проблемы с использованием руководства по использованию SQLite в Android. Я использую ListFragment
вместо ListActivity
(как в примере), поэтому вместо ListFragment
LoaderManager.LoaderCallbacks<Cursor>
используется 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>
.
Спасибо за любые идеи.
Вы не используете правильные реализации 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
, метод NO getSupportLoadManager()
отсутствует.
Любые идеи по этому поводу?
EDIT: следуйте этот учебник, если вы не знаете, как использовать фрагменты. Создайте новый класс с расширением SherlockFragment и переместите свою логику отображения. Сделайте свою прежнюю деятельность расширенной функцией SherlockFragmentActivity и покажите вновь созданный SherlockFragment. Таким образом, я начал работать. Благодаря @JakeWharton!
SherlockListActivity
расширяет ListActivity
. Фрагменты поддержки и загрузчики являются частью библиотеки поддержки, что означает, что вам нужно расширить FragmentActivity
(или SherlockFragmentActivity
).
Несколько вещей, на которые нужно обратить внимание (из моего недавнего опыта борьбы с этим):
Если ваш minSDK установлен менее чем 11 (то есть уровень 10 для Gingerbread), и вы используете пакет поддержки для обратной совместимости, убедитесь, что вы используете
getSupportLoaderManager().initLoader(LOADER_ID, null, this);
Вы упомянули об этом, когда сказали, что используете ListFragment, но он повторяет: не увеличивайте активность, иначе пакет поддержки не будет работать. Вместо этого расширьте класс FragmentActivity или ListFragment.
Для вашего импорта убедитесь, что вы используете правильные версии, если ваш minSDK < 11:
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);
Примечание:
(android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>) this)
не работает.getSupportLoaderManager() or getSupportLoadManager()
не работает.Поздно, но, возможно, помогите кому-нибудь.
если вы используете загрузчик maneger в фрагменте, а вы min api ниже HONEYCOMB
вы shuld использовать этот импорт
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);
В моем случае я должен был продлить действие ActionBarActivity из пакета android.support.v7.app. Тогда я смог использовать
getSupportLoaderManager(). initLoader (0, null, this);
Моя ошибка была beacause this:
//import android.app.ListFragment; Error when doesnt import from support.v4
import android.support.v4.app.ListFragment;
Я использую ActionBarSherlock с моим приложением, и я также столкнулся с этой проблемой и проработал все этапы, обсуждаемые другими в этом вопросе. Тем не менее, я продолжал испытывать такую же проблему, пробовав все предлагаемые резолюции.
The method initLoader(int, Bundle, LoaderManager.LoaderCallbacks<D>) in the type LoaderManager is not applicable for the arguments (int, null, this)
Проблема заключалась в том, что я ожидал, что Eclipse скажет мне, когда я что-то упустил, и это говорило мне об этом, но не так, как я привык. Обычно Eclipse в других случаях скажет мне, что мне не хватает переопределений, чтобы что-то работало, но это прямо не говорит об этом. Я, наконец, поднял на "LoaderManager.LoaderCallbacks" вопрос и понял, что у меня не было обратных вызовов, поэтому эта ошибка была действительно очень достоверной ошибкой. Добавление основных переопределений разрешило мою проблему и позволило мне двигаться вперед.
// 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 на .restartLoader.
Итак, я на самом деле никогда вызывал .initLoader и сразу же вызывал .restartLoader.
У меня был прослушиватель onListItemClick в моем фрагменте, и каждый раз он возвращался из фрагмента и перезагружал onListItemClick и перемещался через приложение, и он продолжал сбой.
Это может быть просто специфично для моего приложения, но, надеюсь, это помогает другим, если у них возникают проблемы с перезагрузкой фрагментов.
Это было частью части файлового менеджера в моем приложении, поэтому он специфичен для нажатия нескольких onListItemClicks во фрагменте, который вы загружаете.
Если вы пробовали все вышеперечисленные методы и по-прежнему сталкивались с той же ошибкой с параметром "this", выполните следующие действия:
Перейдите к настройкам и включите импорт на лету. (по умолчанию это будет и вы можете сделать это, используя клавиши Alt + Enter).
Вырезать весь код действия, которое реализовано
LoaderCallback... и вставьте его в текстовый редактор.
Затем, наконец, скопируйте весь код этого действия из текстового редактора где вы вставили, без каких-либо команд импорта. (Только код класс/активность).
У вас будет много ошибок, поскольку вы еще ничего не импортировали. Просто нажмите Alt + Enter, где вы получаете ошибки, и это библиотеки будут импортированы автоматически. Примечание. Выберите библиотеку android.app... для CursorLoaders.
Входите в ту же проблему. Моя minSdkVersion - 14, поэтому не может использовать пакет android.support.v4.
Я понял это, расширив LoaderCallbacks вместо LoaderManager.LoaderCallbacks и используя эти пакеты
import android.app.LoaderManager.LoaderCallbacks;
import android.content.CursorLoader;
import android.database.Cursor;
import android.widget.SimpleCursorAdapter;
Я обошел это, используя 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, который, в свою очередь, загружает MyListFragment.java
Затем вы можете использовать: getSherlockActivity().getSupportLoaderManager().initLoader(...)
в YourListFragment.java
Не уверен, что это правильный подход, но он сохраняет мою логику во Фрагментах, что приятно.
filldata()
находится в конце файла. Я изменил название пакета. Я также, вероятно, должен был упомянуть, что я использую ActionBarSherlock.