gpt4 book ai didi

Android - 使用 FragmentActivity + Loader 更新 FragmentStatePagerAdapter 的问题

转载 作者:IT老高 更新时间:2023-10-28 23:30:02 26 4
gpt4 key购买 nike

我正在尝试使用 FragmentActivityViewPager 来显示 Fragments 的动态列表。有很多关于如何制作它的静态版本的例子。我的问题是我显示的列表需要动态加载,并且可以根据用户输入(添加/删除)进行更改。我正在尝试使用自定义的 android.support.v4.content.Loader 来加载可用于构建列表的数据集。

在我的设置中一切正常,直到我想更新适配器并发出 FragmentStatePagerAdapter#notifyDataSetChanged() 调用,此时执行此代码(来自 FragmentStatePagerAdapter )

public void finishUpdate(View container)
{
if(mCurTransaction != null)
{
mCurTransaction.commit(); // BANG!!! The exception is thrown
mCurTransaction = null;
mFragmentManager.executePendingTransactions();
}
}

事务提交失败并显示以下消息:

java.lang.IllegalStateException: 无法在 onLoadFinished 内部执行此操作

因为在 FragmentManagerImpl 中执行了这段代码:

private void checkStateLoss() {
if (mStateSaved) {
throw new IllegalStateException(
"Can not perform this action after onSaveInstanceState");
}
if (mNoTransactionsBecause != null) {
throw new IllegalStateException(
"Can not perform this action inside of " + mNoTransactionsBecause);
}
}

原来mNoTransactionsBecause值不为null,返回结果返回onLoadFinished时在LoaderManagerImpl.LoaderInfo中设置了mNoTransactionsBecause

我正在查看各种变量,试图以某种方式将 tramsaction.commit() 更改为 transaction.commitAllowingStateLoss() 但与交易相关的所有内容似乎都是私有(private)的或在最少的包保护。

如果我可以做我需要做的事情(以及如何做),有人可以给我一个大致的想法吗?

请注意,如果我在 AsyncTask 中运行加载操作而不是使用 Loader,我的代码可以正常工作

最佳答案

我遇到了与此非常相似的问题,并通过在 Fragment 上使用处理程序解决了它。

我想在 onLoadFinished() 上显示一个警告对话框,类似于以下内容

public class MyFragment extends Fragment 
implements LoaderManager.LoaderCallbacks<T> {

public void onLoadFinished(Loader<T> loader, T data) {
showDialog();
}

public void showDialog() {
MyAlertDialogFragment fragment = new MyAlertDialogFragment();
fragment.show(getActivity().getSupportFragmentManager(), "dialog");

}
}

但这给出了一个错误

无法在 onLoadFinished 内执行此操作

解决方案是向 fragment 添加一个处理程序以处理显示对话框

private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(msg.what == MSG_SHOW_DIALOG) {
showDialog();
}
}
};

然后修改 onLoadFinished(...) 改为向处理程序发送消息

   public void onLoadFinished(Loader<T> loader, T data) {
handler.sendEmptyMessage(MSG_SHOW_DIALOG);
}

关于Android - 使用 FragmentActivity + Loader 更新 FragmentStatePagerAdapter 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7746140/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com