标签: android-loadermanager

带有LoaderManager的CursorLoader如何知道将光标发送到CursorAdapter?

我正在浏览一些代码,我意识到我实际上并不知道如何使用连接CursorLoaderLoaderManager组合CursorAdapter.这是我困惑的部分.

agendaAdapter = new MyAgendaAdapter(this, null);

makeProviderBundle(new String[] {"_id", "event_name", "start_date", "start_time",
    "end_date", "end_time", "location"}, "date(?) >= start_date and date(?) <= end_date", 
new String[]{getChosenDate(), getChosenDate()}, null);

getLoaderManager().initLoader(0, myBundle, MainDisplayActivity.this);
list.setAdapter(agendaAdapter);
Run Code Online (Sandbox Code Playgroud)

那么query()我的自定义方法如何ContentProvider将其发送到特定的方法CursorAdapter呢?我只是没有看到连接.我理解其他一切,但这个问题是什么.哦,我应该提一下,代码工作正常.

android android-contentprovider android-loadermanager android-cursorloader

22
推荐指数
1
解决办法
2万
查看次数

OnLoadFinished()调用两次

我想弄清楚我是否在装载机方面做错了.我正在使用支持库,我有一个片段,在onCreate()中调用initLoader()将其自身设置为LoaderCallbacks,但是在旋转时它会在onLoadFinished()中接收两次结果,一次调用init (并且它已经拥有数据),并且一旦FragmentActivity循环遍历onStart()中的所有Loaders并提供结果,因为它已经拥有数据.

如果我只调用init一次(在首次启动Fragment时),它不会将自己设置为Loader的回调,因此它根本不会接收对onLoadFinished的调用.好像onLoadFinished应该只被调用一次,因为onLoadFinished()可以完成一些昂贵的事情(例如清除列表适配器等),所以我只想弄清楚这是一个bug还是我是只是在错误的时间或其他地方调用init.

任何人都对此问题有任何见解?

android loader android-fragments android-loadermanager android-fragmentactivity

20
推荐指数
1
解决办法
7588
查看次数

刷新片段内的视图

我搜索了很多看起来像这个问题的问题,但是没有找到我的答案.

我有一个活动,通过操作栏可以访问3个选项卡.我通过添加3个片段来实现这一点,这些片段扩展了我扩展视图类的自定义视图.

在数据库更改的那一刻,我尝试通过调用invalidate()/ postinvalidate()刷新我的选项卡中的视图,但这不起作用.调用片段的onCreateView就像我考虑的其他选项一样.

然而,当我转到另一个选项卡然后返回时,已经进行了更改,并且我的视图会按原样更新.

如何模拟更改为另一个选项卡时发生的相同事情?会发生什么 我试着看看Fragment生命周期(尝试调用onCreateView())来解决它,但它只是不想刷新/重绘它应该.

正确加载数据,因为当我更改为另一个选项卡时数据会更改.

我删除了一些代码,因为它不再相关.我实现了Cursorloaders而不是我自己的Observer模式来通知更改.这是我现在的主要活动.

问题是,如果我想重绘这些片段中的视图,我现在应该怎么做.如果我应用fragmentObject.getView().invalidate()它不起作用.我遇到了和以前一样的问题,但现在我的Observer通知加载器正确实现了数据库中的更改.

public class ArchitectureActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);     
    setContentView(R.layout.main);

    ActionBar actionbar = getActionBar();
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    ActionBar.Tab EditTab = actionbar.newTab().setText("Edit");
    ActionBar.Tab VisualizeTab = actionbar.newTab().setText("Visualize");
    ActionBar.Tab AnalyseTab = actionbar.newTab().setText("Analyse");

    Fragment editFragment = new EditFragment();
    Fragment visualizeFragment = new VisualizeFragment();
    Fragment analyseFragment = new AnalyseFragment();

    EditTab.setTabListener(new MyTabsListener(editFragment));
    VisualizeTab.setTabListener(new MyTabsListener(visualizeFragment));
    AnalyseTab.setTabListener(new MyTabsListener(analyseFragment));

    actionbar.addTab(EditTab);
    actionbar.addTab(VisualizeTab);
    actionbar.addTab(AnalyseTab);

    ArchitectureApplication architectureApplication = (ArchitectureApplication)getApplicationContext();
    architectureApplication.initialize();

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

public …
Run Code Online (Sandbox Code Playgroud)

java android android-fragments android-view android-loadermanager

19
推荐指数
2
解决办法
4万
查看次数

Android错误:java.lang.IllegalStateException:尝试重新查询已经关闭的游标

环境(Linux/Eclipse Dev for Xoom Tablet运行HoneyComb 3.0.1)

在我的应用程序中,我正在使用相机(startIntentForResult())来拍照.拍摄照片后,我得到了onActivityResult()回调,并且能够使用通过"拍照"意图传递的Uri加载位图.此时我的活动已恢复,尝试将图像重新加载到图库时出错:

FATAL EXCEPTION: main
ERROR/AndroidRuntime(4148): java.lang.RuntimeException: Unable to resume activity {...}: 
 java.lang.IllegalStateException: trying to requery an already closed cursor
     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2243)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1019)
     at android.os.Handler.dispatchMessage(Handler.java:99)
     at android.os.Looper.loop(Looper.java:126)
     at android.app.ActivityThread.main(ActivityThread.java:3997)
     at java.lang.reflect.Method.invokeNative(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:491)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
     at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.IllegalStateException: trying to requery an already closed cursor
     at android.app.Activity.performRestart(Activity.java:4337)
     at android.app.Activity.performResume(Activity.java:4360)
     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2205)
     ... 10 more
Run Code Online (Sandbox Code Playgroud)

我正在使用的唯一光标逻辑是在拍摄图像后,我使用以下逻辑将Uri转换为文件

String [] projection = {
    MediaStore.Images.Media._ID, 
    MediaStore.Images.ImageColumns.ORIENTATION,
    MediaStore.Images.Media.DATA 
};

Cursor cursor = activity.managedQuery( …
Run Code Online (Sandbox Code Playgroud)

android cursor illegalstateexception android-loadermanager

18
推荐指数
3
解决办法
2万
查看次数

startManagingCursor的目的是什么?

好的,文档声明它允许Activity管理游标的生命周期.但是我没有真正看到它的重点,因为当活动被销毁时,对新创建的游标的任何引用也应该被删除,然后光标本身在下一个垃圾收集周期中就会消失.那为什么要这么麻烦?

sqlite android cursor android-loadermanager android-cursorloader

17
推荐指数
1
解决办法
2万
查看次数

LoaderManager的范围是什么?

在LoaderManager中识别Loaders时,使用唯一ID.我问的是这些ID有多独特.

每个活动和片段都有自己的LoaderManager吗?片段是否使用他们附加的Activity的LoaderManager?应用程序是否只拥有一个LoaderManager?

如果您能告诉我如何更改您正在使用的LoaderManager,可以获得奖励积分.如果我希望我的Activity中的每个片段都使用相同的LoaderManager(其中一些是拉相同的数据并且共享Loaders会很好),那可能吗?

android android-fragments android-loadermanager android-support-library

16
推荐指数
1
解决办法
2399
查看次数

LoaderManager的范围是什么?

使用Loaders创建Android应用程序时,每个活动和片段都应该有自己的LoaderManager吗?或者应该只有一个LoaderManager应用程序拥有?最后,用于识别LoaderManager课堂外可见特定内容的"唯一ID"是什么?

具体来说,我无法确定应用程序中哪些类应该实现这些LoaderCallback<Cursor>方法(即每个片段应该实现这些回调,还是我应该有一个片段实现回调并查询结果,必要时将它们发送到其他片段/活动) ?

在此先感谢能帮助我的人!我在网上找不到太多关于此的信息.

android android-loadermanager android-loader

16
推荐指数
1
解决办法
2487
查看次数

全局加载器(LoaderManager),用于在多个活动/片段中重用

我想要实现的目标:

我有两个不同的片段.我希望他们两个以两种形式(在列表和地图上)显示相同的数据.我希望他们共享一个Loader(AsyncTaskLoader特别是).一切正常,但装载机不会重复使用.创建另一个并且数据加载两次.

我所做的:

Fragment我使用的LoaderManager lm = getActivity().getSupportLoaderManager(); 两个中我实现LoaderCallbacks<ArrayList<Item>>了所需的方法.在我用两个lm.initLoader(0, args, this);.

但是当我输出lm.toString()它时,看起来这些是两个不同的装载机.并且数据被下载两次.

如何从不同的Activity/Fragment重新连接到同一个Loader,而不是从它开始的那个?

应该是可能的,因为无论如何都要将上下文附加到Loader onCreate(),例如配置更改.

android android-fragments android-3.0-honeycomb android-loadermanager android-fragmentactivity

16
推荐指数
1
解决办法
7514
查看次数

调用initLoader()后,Loader无法启动?

我有一个片段,并且想要在单击按钮时启动加载器:

public class MyFragment extends Fragment {

    public void onActivityCreated() {
        super.onActivityCreated();

        Button btn = ...;
        btn.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                getLoaderManager().initLoader(500, null, mMyCallback);
            }
        });
    }  

    private LoaderManager.LoaderCallbacks<String> mMyCallback = new  LoaderManager.LoaderCallbacks<String>() {

        @Override
        public Loader<String> onCreateLoader(int arg0, Bundle arg1) {
            Log.e(TAG, "LoaderCallback.onCreateLoader().");
            return new MyLoader(getActivity());
        }
    }
}

public class MyLoader extends AsyncTaskLoader<String> {
    public MyLoader(Context context) {
        super(context);
    }

    @Override
    public String loadInBackground() {
        Log.e(TAG, "Hi, running.");
        return "terrific.";
    }
}
Run Code Online (Sandbox Code Playgroud)

单击按钮后,我可以看到我的回调的onCreateLoader方法被调用,但创建的加载器实际上从未启动过.我们是否需要在加载器上调用forceLoad()来实际启动它?没有样本帖子这样做,

谢谢

java android android-fragments android-activity android-loadermanager

16
推荐指数
2
解决办法
1万
查看次数

弃用的getSupportLoaderManager的适当替代者是什么?

我在Android Studio中获得了不推荐使用getSupportLoaderManager的信息.但是我想打个电话:

getSupportLoaderManager().initLoader(0, null, mRecipeLoaderManager);
Run Code Online (Sandbox Code Playgroud)

该电话的替代方案应该是什么?或者我仍然可以使用getSupportLoaderManager而不用担心?

android loader asynctaskloader android-loadermanager

15
推荐指数
5
解决办法
1万
查看次数