有没有办法修改通过CursorLoader加载的值,并在显示到textview之前

时间:2014-10-11 21:20:34

标签: android android-listview loader

我使用普通的旧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线程并卸载那里的工作?

2 个答案:

答案 0 :(得分:0)

是的。它被称为ViewBinder。在您的情况下,您需要SimpleCursorAdapter.ViewBinder。它被调用就像数据从适配器移动到视图中一样。

但是,要小心。它被称为 lot (对于列表的每个单元格中的每个视图可能会多次)。它需要非常快速地运行,除非你想驱动GC螺母,否则不应该分配任何东西。

答案 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线程中完成,并完美地解决了我的问题。