Android LoaderManager和CursorLoader不在ViewPager中工作';s片段

Android LoaderManager和CursorLoader不在ViewPager中工作';s片段,android,android-support-library,android-cursorloader,android-loadermanager,android-loader,Android,Android Support Library,Android Cursorloader,Android Loadermanager,Android Loader,我在ViewPager中有一个名为AllSongsFragment的片段。父级Activity扩展了android.support.v4.app.FragmentActivity 我试图实现LoaderManager和CursorLoader以异步获取游标。以下是所有歌曲片段: import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager; import android.support.v4

我在
ViewPager
中有一个名为
AllSongsFragment
的片段。父级
Activity
扩展了
android.support.v4.app.FragmentActivity

我试图实现
LoaderManager
CursorLoader
以异步获取游标。以下是
所有歌曲片段

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

public class AllSongsFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {
public void onActivityCreated(Bundle savedInstanceState) {
    .
    .
    getLoaderManager().initLoader(0, null, this);
}


@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    Toast.makeText(getActivity(), "YAYYYY", Toast.LENGTH_SHORT);
    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String[] projection = new String[] {MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ARTIST};
    CursorLoader cursorLoader = new CursorLoader(getActivity(), uri, projection, null, null, null);
    return cursorLoader;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    Toast.makeText(getActivity(), "finished", Toast.LENGTH_SHORT);
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
    // TODO
}
}
导入android.support.v4.app.Fragment;
导入android.support.v4.app.LoaderManager;
导入android.support.v4.content.Loader;
导入android.support.v4.content.CursorLoader;
公共类AllSongsFragment扩展片段实现LoaderManager.LoaderCallbacks{
已创建ActivityState上的公共无效(Bundle savedInstanceState){
.
.
getLoaderManager().initLoader(0,null,this);
}
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
Toast.makeText(getActivity(),“yayyy”,Toast.LENGTH\u SHORT);
Uri Uri=MediaStore.Audio.Media.EXTERNAL\u CONTENT\u Uri;
字符串[]投影=新字符串[]{MediaStore.Audio.Media.\u ID,MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.ARTIST};
CursorLoader CursorLoader=新的CursorLoader(getActivity(),uri,projection,null,null);
返回游标装入器;
}
@凌驾
public void onLoadFinished(加载器,光标){
Toast.makeText(getActivity(),“finished”,Toast.LENGTH\u SHORT);
}
@凌驾
公共void onLoaderReset(加载器){
//待办事项
}
}

我的问题是没有调用onCreateLoader()或任何LoaderManager回调方法。应用程序也不会崩溃,也没有例外。我做错了什么?

您正在使用支持库类
LoaderManager
CursorLoader
。因此,您需要使用对支持
LoaderManager
的调用

替换

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

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

现在似乎在通过按back销毁活动时调用了onLoaderReset()。如果我尝试在onLoaderReset()中制作一个Toast,我会得到一个NullPointerException,这一定是因为活动被销毁,getActivity()返回null。但是,仍然没有调用onCreateLoader()。我使用支持库的唯一原因是,没有它,不可能使用FragmentPagerAdapter。是的,我理解。但它现在应该可以工作了。我不明白为什么它不适合你。还有更多的细节吗?我不知道还有其他与这个问题相关的代码。在另一个线程中,与我有相同设置的人说他的问题是通过使用getLoaderManager.initLoader()解决的。在另一个线程中,有人说LoaderManager在不调用forceLoad()的情况下永远不会工作。所以我想知道如何调用这个方法。它实际上是在使用我的原始代码。我的问题是,我使用Toast来确认方法调用,而Toast没有被创建。另一个问题是,我的BaseAdapter没有使用我从异步加载的游标创建的ArrayList更新自身,但它将用于另一个线程。谢谢你的时间,@Y.SHey不客气。。。顺便说一句,在API级别<11的设备上调用
getLoaderManager()
可能会失败,因此您应该在此处使用
getSupportLoaderManager()
)。。。。。另外,
getLoaderManager()
在支持
Loader
s和
LoaderManager
s的
Nexus5
上肯定不适合我。。。奇怪:/i我的原始代码实际上正在工作。经验教训:永远不要用祝酒来确认方法调用。相反,请使用android.util.LogI。现在请意识到我没有在Toast上调用show()。我真蠢。
getActivity().getSupportLoaderManager().initLoader(0, null, (LoaderCallbacks<Cursor>)this);