尽pipe类(ListFragment)实现LoaderManager.LoaderCallbacks <cursor>,但getLoaderManager()。initLoader()不接受“this”作为参数。
按照在Android中使用SQLite的指导 ,我遇到了麻烦。 我使用ListFragment
而不是ListActivity
(如示例中所示),所以我使用ListFragment
实现LoaderManager.LoaderCallbacks<Cursor>
来代替。 然后,在fillData()
方法中:
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,并使用这些:
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()
。
任何想法呢?
编辑:按照这个教程,如果你不知道如何使用片段。 创build一个扩展SherlockFragment的新类,并在那里移动显示逻辑。 让你的旧活动扩展SherlockFragmentActivity,并显示新创build的SherlockFragment。 这样我才能工作。 感谢@JakeWharton!
一些需要注意的事情(从我最近的经验来看):
-
如果您的minSDK设置为小于11(即姜饼级别为10),并且您正在使用支持包以实现向后兼容,请确保使用
getSupportLoaderManager().initLoader(LOADER_ID, null, this);
-
当你提到你使用ListFragment的时候,你提到过这个问题,但是需要重复一下:不要扩展Activity,否则支持包将不起作用。 相反,扩展FragmentActivity类或ListFragment类。
-
对于您的导入,请确保您使用正确的版本,如果您的minSDK <11:
android.support.v4.app.FragmentActivity; android.support.v4.app.LoaderManager; android.support.v4.content.Loader;
希望这可以帮助你…或者至less是别人…
施放第三个参数解决了我的情况下的问题:
从
getLoaderManager().initLoader(0, null, this);
至
getLoaderManager().initLoader(0, null, (android.app.LoaderManager.LoaderCallbacks<Cursor>) this);
注意:
- minSdk是8,我正在使用支持库v4。
-
(android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>) this)
没有工作。 -
getSupportLoaderManager() or getSupportLoadManager()
不起作用。 - 这段代码在活动内部不是片段
已经很晚了,但也许有帮助。
如果你在碎片中使用loader maneger,并且你的api低于HONEYCOMB
你shuld使用这个import
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.app.ListFragment; Error when doesnt import from support.v4 import android.support.v4.app.ListFragment;
在我的情况下,我必须从android.support.v7.app包中获得Activity extend ActionBarActivity。 那时我才能够使用
getSupportLoaderManager()。initLoader(0,null,this);
更改您的导入
import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader;
并使用
getSupportLoaderManager().initLoader(0, null, this);
我正在使用ActionBarSherlock和我的应用程序,我也遇到了这个问题,并通过其他人在这个问题上讨论的所有步骤。 但是,在尝试所有build议的解决scheme后,我仍然遇到同样的问题。
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”是问题,并意识到我没有callback,因此这个错误实际上是一个非常有效的错误。 添加基本覆盖解决了我的问题,并允许我前进。
// 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); }
我通过使用SherlockListFragment(或者你可以使用ListFragment,我想)来解决这个问题,但是它包含在一个Activity中。 我首先创build了一个如下所示的genericsFragmentHolderActivity类:
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); } } }
然后,您需要为您的片段创build一个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(...)
使用getSherlockActivity().getSupportLoaderManager().initLoader(...)
不知道这是否是正确的方法,但它保持了我所有的碎片逻辑,这是很好的。
跑到同样的问题。 我的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;
如果您已经尝试了上述所有方法,仍然面临与“this”参数相同的错误,请按照下列步骤操作:
-
转到设置并启用导入dynamic选项(默认情况下,它将被启用,你可以通过使用Alt + Enter键来完成)。
-
削减已经实施的活动的整个代码
LoaderCallback …并将其粘贴到文本编辑器中。 -
然后,最后从粘贴的文本编辑器中复制该活动的整个代码,而不需要任何导入命令(仅限于类/活动的代码)。
-
由于您尚未导入任何内容,因此会出现很多错误。 只要按下Alt + Enter,你会得到错误,它的库将被自动导入。 注意:为CursorLoadersselectandroid.app …库。