SimpleCursorAdapter的旧构造函数已弃用..真的吗?

这里说的是, SimpleCursorAdapter的API级别1的构造函数已被弃用,build议使用LoaderManagerCursorLoader

但深入到LoaderManagerCursorLoader的使用我发现这个例子里面的内部类扩展了一个ListFragment (我想Fragment的扩展本身),我们创build一个CursorLoader 。 除了CursorLoaderUri作为参数之外,一切似乎都可以。 所以这意味着我需要创build一个ContentProvider来访问我的数据库。

我必须承认它看起来像一个矫枉过正的不得不通过所有这些只是创build一个简单的ListView与来自数据库的项目。 特别是如果我不打算让我的数据库数据可用于其他应用程序,内容提供商的主要目的是要做到这一点。

那真的值得吗?

特别是在像我这样的情况下,要获取的内容可能会很小。 我正在认真考虑这样做,你说什么?

我写了一个简单的CursorLoader ,它不需要内容提供者:

 import android.content.Context; import android.database.Cursor; import android.support.v4.content.AsyncTaskLoader; /** * Used to write apps that run on platforms prior to Android 3.0. When running * on Android 3.0 or above, this implementation is still used; it does not try * to switch to the framework's implementation. See the framework SDK * documentation for a class overview. * * This was based on the CursorLoader class */ public abstract class SimpleCursorLoader extends AsyncTaskLoader<Cursor> { private Cursor mCursor; public SimpleCursorLoader(Context context) { super(context); } /* Runs on a worker thread */ @Override public abstract Cursor loadInBackground(); /* Runs on the UI thread */ @Override public void deliverResult(Cursor cursor) { if (isReset()) { // An async query came in while the loader is stopped if (cursor != null) { cursor.close(); } return; } Cursor oldCursor = mCursor; mCursor = cursor; if (isStarted()) { super.deliverResult(cursor); } if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) { oldCursor.close(); } } /** * Starts an asynchronous load of the contacts list data. When the result is ready the callbacks * will be called on the UI thread. If a previous load has been completed and is still valid * the result may be passed to the callbacks immediately. * <p/> * Must be called from the UI thread */ @Override protected void onStartLoading() { if (mCursor != null) { deliverResult(mCursor); } if (takeContentChanged() || mCursor == null) { forceLoad(); } } /** * Must be called from the UI thread */ @Override protected void onStopLoading() { // Attempt to cancel the current load task if possible. cancelLoad(); } @Override public void onCanceled(Cursor cursor) { if (cursor != null && !cursor.isClosed()) { cursor.close(); } } @Override protected void onReset() { super.onReset(); // Ensure the loader is stopped onStopLoading(); if (mCursor != null && !mCursor.isClosed()) { mCursor.close(); } mCursor = null; } } 

它只需要AsyncTaskLoader类。 可以是Android 3.0或更高版本,也可以是兼容性软件包。

只需要使用它下面的构造函数,即采取标志的构造函数。 不要使用FLAG_AUTO_REQUERY,只将0传递给标志。

除非您真的需要在用户查看ListView时处理对底层数据库的数据更改,那么您无需担心需要重新查询。

另一方面,如果您希望ListView在用户查看列表时显示对数据库的更改,请按照Google的build议并使用CursorLoader。

编辑:

由于第二个构造函数只能在API 11中使用,所以您可能只想自己扩展CursorAdapter。 你几乎只需要实现bindView和newView,你就完成了。

仅使用simpleCursorAdapter不推荐使用的构造函数。 这种错误出现在我正在开发我的应用程序,但我用它,它与我的应用程序完美的工作。 或者尝试在Android开发者网站中使用下面的构造函数,它有一个额外的参数,即标志参数。

我相信CursorLoader目前是用于一个ContentProvider。

如果你想使用新的框架直接从你的数据库加载; 您可以考虑扩展AsyncTaskLoader并从onCreateLoader返回而不是使用CursorLoader。

如果你正在使用现有的方法,你必须更加小心你的查询操作需要多长时间。 如果您的查询需要花费大量的时间,请考虑使用AsyncTask加载游标(并注意在UI线程中运行的重新查询)。

我知道这个线程是旧的,但你可以添加一个最后一个参数到SimpleCursorAdapter对象创build。 只需添加“,0”。

这是Android喜欢的标志,警告消失。

例:

 SimpleCursorAdapter dataAdapter = new SimpleCursorAdapter(getApplicationContext(), R.layout.item_list_layout, cursor, fromDB(), toLayout(), 0);