Вопрос по android-listfragment, sqlite, android, android-loadermanager – getLoaderManager (). initLoader () не принимает «this» в качестве аргумента, хотя класс (ListFragment) реализует LoaderManager.LoaderCallbacks <Cursor>
У меня возникли проблемы сруководство по использованию 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>
.
Спасибо за любые идеи.
filldata()
находится в конце файла. Я изменил название пакета. Я также, вероятно, должен был упомянуть, что использую ActionBarSherlock.
vurp0
Вы не используете правильные реализацииCursorLoader
а такжеLoader
.
Remove your old imports and use these ones:
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()
.
Есть идеи по этому поводу?
РЕДАКТИРОВАТЬ: следоватьэтот урок если вы не знаете, как использовать фрагменты. Создайте новый класс с расширением SherlockFragment и переместите туда свою логику отображения. Сделайте ваше старое действие расширенным SherlockFragmentActivity и покажите вновь созданный SherlockFragment. Таким образом, я получил это работает. Спасибо @JakeWharton!
и я тоже столкнулся с этой проблемой и прошел все шаги, которые обсуждали другие в этом вопросе. Однако у меня продолжала возникать та же проблема после пробования всех предложенных резолюций.
The method initLoader(int, Bundle, LoaderManager.LoaderCallbacks<D>) in the type LoaderManager is not applicable for the arguments (int, null, this)
Проблема заключалась в том, что я ожидал, что «Затмение» расскажет мне, когда я что-то упустил, и это говорило мне об этом, но не так, как я привык. Обычно Eclipse в других случаях говорит мне, что я пропускаю переопределения, чтобы заставить что-то работать, но это прямо не говорит об этом здесь. Я наконец-то подобрал & quot; LoaderManager.LoaderCallbacks & quot; будучи проблемой и понял, что у меня не было обратных вызовов для нее, таким образом, эта ошибка была на самом деле очень допустимой ошибкой. Добавление основных переопределений решило мою проблему и позволило мне двигаться вперед.
// 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);
}
я пытался привести как @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
версии были импортированы.
когда мой AsyncTaskLoader не возвращал мой список, но я решил изменить вызов с .initLoader на .restartLoader.
Так что я на самом делеnever вызвал .initLoader и просто сразу вызвал .restartLoader.
У меня был прослушиватель onListItemClick в моем фрагменте, и каждый раз, когда он возвращался из фрагмента, перезагружал onListItemClick и просматривал приложение, в котором он продолжал падать.
Это может быть просто для моего приложения, но, надеюсь, это поможет другим, если у них возникнут проблемы с перезагрузкой фрагмента.
Это было частью файлового менеджера в моем приложении, так что это специфическое нажатие на несколько onListItemClicks во фрагменте, который вы загружаете.
если вы используете загрузчик менеджер во фрагменте, и вы мин 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*/);
надеюсь, это поможет кому-нибудь.
ользовать 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
Не уверен, что этоcorrect подход, но он сохраняет всю мою логику во фрагментах, что приятно.
поэтому я не могу использовать пакет android.support.v4.
Я понял это путем расширения LoaderCallbacks вместо LoaderManager.LoaderCallbacks и использую эти пакеты
import android.app.LoaderManager.LoaderCallbacks;
import android.content.CursorLoader;
import android.database.Cursor;
import android.widget.SimpleCursorAdapter;
иваетесь с той же ошибкой с помощью команды "this" параметр, затем выполните следующие действия:
Go to settings and enable imports on the fly option.(by default it'll be enabled and you can do this by using Alt+Enter keys).
Cut the whole code of the activity which had implemented
LoaderCallback... and paste it in a text editor.
Then at last copy the whole code of that activity from the text editor where you had pasted, without any import commands.( Only the code of the class/activity).
You'll get lots of errors as you have imported nothing yet. Just press Alt+Enter wherever you're getting the errors and it's libraries will be imported automatically. Note : Choose android.app... library for CursorLoaders.
от
getLoaderManager().initLoader(0, null, this);
в
getLoaderManager().initLoader(0, null, (android.app.LoaderManager.LoaderCallbacks<Cursor>) this);
Замечания:
minSdk was 8 and i was using support library v4.(android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>) this)
did not work.
getSupportLoaderManager() or getSupportLoadManager()
did not work.
This code was inside activity not fragment
на которые стоит обратить внимание (из моего недавнего опыта борьбы с этим):
If your minSDK is set to less than 11 (i.e. level 10 for Gingerbread) and you are using the Support Pack for backward compatibility, make sure you use
getSupportLoaderManager().initLoader(LOADER_ID, null, this);
You mentioned this when you said you are using ListFragment, but it bears repeating: Do not extend Activity, otherwise the support package will not work. Instead, extend the FragmentActivity class or the ListFragment class.
For your imports, make sure you are using the correct versions if your minSDK < 11:
android.support.v4.app.FragmentActivity;
android.support.v4.app.LoaderManager;
android.support.v4.content.Loader;
Надеюсь, это поможет вам ... или, по крайней мере, кому-то еще ...