我有DialogFragment
使用Cursor setMultiChoiceItems
。在Cursor
的帮助下获得此LoaderManager
。
使用onCreateDialog方法处理此问题的最佳方法是什么?调用此方法后,加载程序将启动,因此一开始就无法对AlertDialog.Builder使用Cursor。
有没有一种方法可以在调用onLoadFinished时更新Dialog UI?理想情况下,我想设置一个初始加载UI,一旦Cursor可用,然后更新UI。
我有一个正在运行的实现,它只是将Cursor加载到Fragment之外并进入Activity。我不喜欢这个,因为它不是很模块化。我可以编写一个Fragment类来填充它自己的视图,并在Cursor完成时交换它们,但这看起来也不是很优雅。
由于这是一个设计问题,而不是特定的编码问题,我遗漏了示例代码。我正在寻找的答案应该基于如何在DialogFragment类中很好地管理这种工作流程,使用AlertDialog.Builder创建对话框视图。
答案 0 :(得分:2)
老问题,但也许答案有助于某人。
以下是一些示例代码:
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。