【问题标题】:LoaderManager and CursorLoader not working in ViewPager's FragmentLoaderManager 和 CursorLoader 在 ViewPager 的 Fragment 中不起作用
【发布时间】:2015-04-02 12:35:12
【问题描述】:

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

我正在尝试实现LoaderManagerCursorLoader 以异步获取游标。下面是AllSongsFragment

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
}
}

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

【问题讨论】:

  • 我的原始代码实际上正在运行。经验教训:永远不要使用 Toast 来确认方法调用。而是使用 android.util.Log
  • 我现在意识到我没有在 Toast 上调用 show()。我多么愚蠢。

标签: android android-support-library android-cursorloader android-loadermanager android-loader


【解决方案1】:

您正在使用支持库类LoaderManagerCursorLoader。因此,您需要调用 support LoaderManager

替换

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

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

【讨论】:

  • 现在看来,onLoaderReset() 是在通过按回销毁活动时调用的。如果我尝试在 onLoaderReset() 中进行 Toast,我会得到一个 NullPointerException,这一定是因为活动被破坏并且 getActivity() 返回 null。但是,仍然没有调用 onCreateLoader()。我使用支持库的唯一原因是没有它就无法使用 FragmentPagerAdapter。
  • 是的,我明白了。但它现在应该可以工作了。我不明白为什么它不适合你。还有更多细节吗?
  • 我不知道与该问题相关的任何其他代码。在另一个线程上,与我有相同设置的人说他的问题是通过使用 getLoaderManager.initLoader() 解决的。在另一个线程上,有人说 LoaderManager 在不调用 forceLoad() 的情况下永远不会工作。所以我想弄清楚如何调用该方法。
  • 它实际上是在使用我的原始代码。我的问题是我使用 Toasts 来确认方法调用并且没有创建 Toasts。另一个问题是我的 BaseAdapter 没有使用我从异步加载的游标创建的 ArrayList 更新自身,但它将用于另一个线程。谢谢你的时间,@Y.S
  • 不客气...顺便说一句,在 API 级别 getLoaderManager() 可能会失败,因此您应该使用 @ 987654327@ 这里 :) ..... 另外,getLoaderManager()Nexus 5 的支持下对我不起作用 Loaders 和 LoaderManagers ...奇怪:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多