我使用普通的旧ListViews,SimpleCursorAdapter,LoaderCallback等来从数据库中读取值并在textViews中显示。
示例代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.cateory_list);
mListView = (ListView) findViewById(R.id.list_view);
mAdapter = new SimpleCursorAdapter(
this,
R.layout.category_parent,
null,
new String[] {CategoryTable.COL_2},
new int[] {R.id.text_view},
0);
mListView.setAdapter(mAdapter);
getLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri uri = new Uri.Builder()
.scheme("content")
.appendPath(CategoryTable.TB_NAME)
.authority("com.example.auth")
.build();
return new CursorLoader(this, uri, null, null, null, null);
}
一切正常,数据库中的值显示在列表视图中。但是假设我想在显示之前对值进行一些文本处理,我该怎么办呢?
编辑1:我不想在主线程中进行文本处理。有没有办法可以使用从CursorLoader创建的AsynTaskLoader线程并卸载那里的工作?
答案 0 :(得分:0)
是的。它被称为ViewBinder
。在您的情况下,您需要SimpleCursorAdapter.ViewBinder
。它被调用就像数据从适配器移动到视图中一样。
答案 1 :(得分:0)
我设法通过扩展CursorLoader来创建自定义加载器,并且仅覆盖public Cursor loadInBackground()
这样我就可以检索数据,长时间运行文本处理,将结果插回新表并返回新表的光标。
示例代码:
@Override
public Cursor loadInBackground() {
Cursor cursor = super.loadInBackground();
cursor.moveToFirst();
try {
ActiveAndroid.beginTransaction();
do {
String s = doProcessing(cursor.getString(colNumber));
createAndInsertIntoNewTable(s);
} while (cursor.moveToNext());
ActiveAndroid.setTransactionSuccessful();
} finally {
ActiveAndroid.endTransaction();
}
return cursorFromNewTable;
}
这完全可以在AsyncTaskLoader线程中完成,并完美地解决了我的问题。