使用数据库数据填充 ListFragment

Populating a ListFragment with database data

我有一个 ListFragment,我想要的行为是输入该片段并查看它填充了我拥有的数据库中的数据。困难的部分是我还希望这个片段知道何时将新行添加到数据库并显示它。

目前我唯一的解决办法是在片段内每隔一定时间执行一次更新,但我想知道是否有更有效的解决方案以及如何实现。

您可以为此使用 CursorLoader。它还假设您有一个 ContentProvider 作为应用程序的数据源,我不会在这里讨论,但如果您愿意,可以在 this post 中了解它们。

要将数据库数据同步到您的 ListView,您必须做两件事:

  • 创建一个实现 CursorAdapter 的自定义适配器
  • 在您的 Fragment 中实现 LoaderManager

要实现 LoaderManager,只需覆盖三个必需的方法。一个用于设置您的游标,一个将结果提供给您的适配器。从那时起,假设您的 ContentProvider 正确通知任何 URI 更改,您将注意到适配器中的这些更改。这是加载程序代码的片段:

public class AccountsFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor>{
    private static final int MY_LOADER = 0;

    @Override
    public void onActivityCreated() {
        super.onActivityCreated();
        getLoaderManager.initLoader(MY_LOADER, null, this);
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        switch(id){
            case MY_LOADER:
                return new CursorLoader(
                        getActivity(),
                        MY_URI,
                        MY_COLUMNS,
                        null,
                        null,
                        null
                );
            default:
                throw new UnsupportedOperationException("Unknown loader id: " + id);
        }
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        switch(loader.getId()){
            case MY_LOADER:
                mAdapter.swapCursor(datA);
            default:
                throw new UnsupportedOperationException("Unknown loader id: " + loader.getId());
        }
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        switch(loader.getId()){
            case MY_LOADER:
                mAdapter.swapCursor(null);
                break;
            default:
                throw new UnsupportedOperationException("Unknown loader id: " + loader.getId());
        }
    }

}

我从 Udacity course 那里学到了很多这方面的知识,它自下而上地教了你很多关于 Android 的知识,如果你正在寻找一个完整的概述,我认为这非常值得你时间.