2

我在与从ListFragment外部调用restartLoader()有点问题。序列按照Tap的“Add”按钮进行,该按钮打开一个Activity - > Enter data - > Tap Save,它启动一个AsyncTask将数据存储在服务器上。在数据传输成功后,返回到前面的活动 - >让活动调用运行getLoaderManager()。的restartLoader()的ListFragment中的方法。RestartLoader从FragmentActivity

这样做总是会创建一个“java.lang.IllegalStateException:Fragment ListsFragment {42481238}”,并且不会附加到Activity“-error”。如果我移动restartLoader(),以它的onResume工作稍微好一点,但我有直接修改连接到ListFragments数据,仍然引发一个IllegalStateException不管其他按钮。从logcat的

E/AndroidRuntime(29594): java.lang.IllegalStateException: Fragment ListsFragment{42450b18} not attached to Activity 
E/AndroidRuntime(29594):  at android.support.v4.app.Fragment.getLoaderManager(Fragment.java:768) 
E/AndroidRuntime(29594):  at testpager.ListsFragment.resetList(ListsFragment.java:122) 

摘录错误消息我在想什么?如何从FragmentActivity刷新ListFragment而不触发此异常?

回答

0

如果我理解正确的话,你有创造,有一个菜单选项,以节省通过活动B.数据装载机活动A完成活动B已经保存的数据,你要重新启动在活动A装载机...我对吗?

如果是的话,尝试在活动B这样做:

public interface onSavedDataListener { 
    void DoneSavingData(); //add parameters if needed 
} 
... //Whatever other code you have 
//This method should be called from your AsyncTask onFinished() method 
public void dataSaved() { //add parameters if needed 
    onSavedDataListener activity = (onSavedDataListener) getActivity(); 
    activity.DoneSavingData(); //make sure you add the same parameters as you did above 
} 
在活动A

然后,你将实现

public class ActivityA extends ListFragment implements onSavedDataListener { 

    ... //your other code here 

    //Add the listener function 
    public void DoneSavingData() { //make sure any parameters you have get added here 
     getLoaderManager().restartLoader(id, args, loadercallback); 
    } 

    ... 

从本质上说,您创建活动B的监听对象的监听器在活动A中实施。我希望我是对的,它会帮助你...

+0

顺便说一句,如果您使用的是支持包为以前的SDK向后兼容,你应该调用getSupportLoaderManager(),而不是... – wileyCoyote 2012-07-25 02:06:13

3

你不应该从FragmentActivity刷新ListFragment ...这样对两种都Fragment S的基本设计方针(其应该被设计用于复用和不依赖于任何一种具体的活性)和LoaderManager(这是应该属于单个ActivityFragment)。您应该让ListFragment改为实现LoaderManager.LoaderCallbacks<D>接口。

另一方面,Loaders应当在其基础数据源发生更改时接收通知,通知它们执行新的异步加载并将结果返回给回调的onLoadFinished方法。如果你必须依靠restartLoader获得最先进的最新数据,那么你做错了什么(即你的ContentObserver没有被通知将已经暗示了Loader重新查询其数据变化)。

+0

对不起,我迟到不可原谅的响应。我的项目被搁置了一段时间,但我正在重新铺设它。 – 2012-12-03 19:59:42

+0

对不起我的不可思议的迟到回应。我实际上使用LoaderManager.LoaderCallbacks 和基督徒加载程序http://stackoverflow.com/questions/7182485/usage-cursorloader-without-contentprovider 我试图做一个实现,使用一个加载程序,但不一定包括整个内容提供商自我只会在我自己的应用程序中运行它。我读过这个http://stackoverflow.com/a/4245672/975641,似乎提供者可能是矫枉过正。 有什么想法?可能是这是一个全新的问题。只是试图澄清。 – 2012-12-03 20:12:45

+3

'Commonsware'总是会谈论有关'ContentProvider'的垃圾:P。我们的观点是,CP对于不共享数据的应用程序是过度杀伤力的......我几乎同意这一点,*但是*我真正喜欢的关于CP +加载程序组合的一点是它配备了全局通知系统。也就是说,如果在CP查询方法中的光标上调用'setNotificationUri()',并在插入/删除方法中调用notifyUri(),那么将在整个* entire *应用程序中通知游标内容更改(即no投票需要!)。 ContentResolver没有简单的方法来做到这一点。 – 2012-12-06 16:07:37