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);