android – 使用DialogFragment处理LoaderCallbacks的优雅方式

我有一个DialogFragment,它使用Cursor for setMultiChoiceItems.在LoaderManager的帮助下获取此Cursor.

使用onCreateDialog方法处理此问题的最佳方法是什么?调用此方法后,加载程序将启动,因此一开始就没有可供AlertDialog.Builder使用的Cursor.

有没有一种方法可以在调用onLoadFinished时更新Dialog UI?理想情况下,我想设置一个初始加载UI,一旦Cursor变得可用,然后更新UI.

我有一个正在工作的实现,它只是将Cursor加载到Fragment之外并进入Activity.我不喜欢这个,因为它不是很模块化.我可以编写一个Fragment类来填充它自己的视图并在Cursor结束时交换它们,但这似乎也不是很优雅.

由于这是一个设计问题,而不是特定的编码问题,我遗漏了示例代码.我正在寻找的答案应该基于如何在DialogFragment类中很好地管理这种工作流,使用AlertDialog.Builder来创建Dialog视图.

最佳答案 老问题,但也许答案有助于某人.

>在onCreate(),onCreateView或onActivityCreated()中启动CursorLoader,并不重要imo
>在onCreateDialog中创建适配器和对话框.该对话框将使用空的适配器,直到加载数据
>将适配器的光标交换到onLoadFinished

这是一些示例代码:

public class MyDialogFragment extends DialogFragment implements LoaderManager.LoaderCallbacks<Cursor> {

    private CursorAdapter mAdapter;

    public static MyDialogFragment newInstance() {
        return new MyDialogFragment();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getLoaderManager().initLoader(0, null, this);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        mAdapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_single_choice, null,
                    new String[] {FolderColumns.NAME}, new int[] {android.R.id.text1}, 0);

        return new AlertDialog.Builder(getContext())
                .setAdapter(mAdapter, null)
                .create();
    }

    @Override
    public synchronized Loader<Cursor> onCreateLoader(int id, Bundle args) {
        Uri uri = ...;
        return new CursorLoader(getActivity(), uri, null, null, null, null);
    }

    @Override
    public synchronized void onLoaderReset(Loader<Cursor> loader) {
        mAdapter.swapCursor(null);
    }

    @Override
    public synchronized void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        if (cursor != null && !cursor.isClosed()) {
            mAdapter.swapCursor(cursor);
        }
    }

}

请注意,无法在onCreate中创建适配器,因为在onCreate之前调用了onCreateDialog.

点赞