我正在开发一个依赖于数据库(本地)的应用程序 - 而且这个数据库经常更新。
我想要达到的目标是: 假设数据显示在列表视图中。我希望listview在数据库发生任何更改后立即更新数据集(或者确切地说是特定的表)。
到目前为止,我已经考虑过这些选项:
哪种方法可以在不阻止UI(性能)的情况下实现一致且即时的更新?
答案 0 :(得分:1)
正如@Karakuri所建议的那样,通过在不使用ContentProvider的情况下扩展CursorLoader类来创建自定义CursorLoader。
以下是解决方案:
CustomCursorLoader.class
public class CustomCursorLoader extends CursorLoader {
private final ForceLoadContentObserver forceLoadContentObserver = new ForceLoadContentObserver();
public CustomCursorLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
super(context, uri, projection, selection, selectionArgs, sortOrder);
}
@Override
public Cursor loadInBackground() {
Cursor cursor = /* get cursor from DBHandler class */;
cursor.setNotificationUri(getContext().getContentResolver(), CONTENT_URI);
if (cursor != null) {
cursor.getCount();
cursor.registerContentObserver(forceLoadContentObserver);
}
return cursor;
}
}
每次更改数据库时,请执行以下操作:
getContentResolver().notifyChange(CONTENT_URI, null);
在Activity类中:
实现接口LoaderManager.LoaderCallbacks<Cursor>
启动加载程序getLoaderManager().initLoader(0, null, this);
并覆盖这些方法:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CustomCursorLoader(this, CONTENT_URI, null, null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
customCursorLoaderAdapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
customCursorLoaderAdapter.swapCursor(null);
}
扩展CursorAdapter
类以创建listview适配器,您已完成。