我正在浏览一些代码,我意识到我实际上并不知道如何使用连接CursorLoader
和LoaderManager
组合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
我想弄清楚我是否在装载机方面做错了.我正在使用支持库,我有一个片段,在onCreate()中调用initLoader()将其自身设置为LoaderCallbacks,但是在旋转时它会在onLoadFinished()中接收两次结果,一次调用init (并且它已经拥有数据),并且一旦FragmentActivity循环遍历onStart()中的所有Loaders并提供结果,因为它已经拥有数据.
如果我只调用init一次(在首次启动Fragment时),它不会将自己设置为Loader的回调,因此它根本不会接收对onLoadFinished的调用.好像onLoadFinished应该只被调用一次,因为onLoadFinished()可以完成一些昂贵的事情(例如清除列表适配器等),所以我只想弄清楚这是一个bug还是我是只是在错误的时间或其他地方调用init.
任何人都对此问题有任何见解?
android loader android-fragments android-loadermanager android-fragmentactivity
我搜索了很多看起来像这个问题的问题,但是没有找到我的答案.
我有一个活动,通过操作栏可以访问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
环境(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) 好的,文档声明它允许Activity管理游标的生命周期.但是我没有真正看到它的重点,因为当活动被销毁时,对新创建的游标的任何引用也应该被删除,然后光标本身在下一个垃圾收集周期中就会消失.那为什么要这么麻烦?
sqlite android cursor android-loadermanager android-cursorloader
在LoaderManager中识别Loaders时,使用唯一ID.我问的是这些ID有多独特.
每个活动和片段都有自己的LoaderManager吗?片段是否使用他们附加的Activity的LoaderManager?应用程序是否只拥有一个LoaderManager?
如果您能告诉我如何更改您正在使用的LoaderManager,可以获得奖励积分.如果我希望我的Activity中的每个片段都使用相同的LoaderManager(其中一些是拉相同的数据并且共享Loaders会很好),那可能吗?
android android-fragments android-loadermanager android-support-library
使用Loaders创建Android应用程序时,每个活动和片段都应该有自己的LoaderManager
吗?或者应该只有一个LoaderManager
应用程序拥有?最后,用于识别LoaderManager
课堂外可见特定内容的"唯一ID"是什么?
具体来说,我无法确定应用程序中哪些类应该实现这些LoaderCallback<Cursor>
方法(即每个片段应该实现这些回调,还是我应该有一个片段实现回调并查询结果,必要时将它们发送到其他片段/活动) ?
在此先感谢能帮助我的人!我在网上找不到太多关于此的信息.
我想要实现的目标:
我有两个不同的片段.我希望他们两个以两种形式(在列表和地图上)显示相同的数据.我希望他们共享一个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
我有一个片段,并且想要在单击按钮时启动加载器:
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
我在Android Studio中获得了不推荐使用getSupportLoaderManager的信息.但是我想打个电话:
getSupportLoaderManager().initLoader(0, null, mRecipeLoaderManager);
Run Code Online (Sandbox Code Playgroud)
该电话的替代方案应该是什么?或者我仍然可以使用getSupportLoaderManager而不用担心?