Android 是否有一种方法可以在显示到textview之前修改通过游标加载程序加载的值

Android 是否有一种方法可以在显示到textview之前修改通过游标加载程序加载的值,android,android-listview,loader,Android,Android Listview,Loader,我使用普通的旧ListView、SimpleCursorAdapter、LoaderCallback等从数据库中读取值并在文本视图中显示 示例代码: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.cateory_list); mListView = (ListView) f

我使用普通的旧ListView、SimpleCursorAdapter、LoaderCallback等从数据库中读取值并在文本视图中显示

示例代码:

@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);
}
@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;
    }
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.Caterory_列表);
mListView=(ListView)findViewById(R.id.list\u视图);
mAdapter=新的SimpleCursorAdapter(
这
R.layout.category_父级,
无效的
新字符串[]{CategoryTable.COL_2},
新int[]{R.id.text_view},
0);
mListView.setAdapter(mAdapter);
getLoaderManager().initLoader(0,null,this);
}
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
Uri=新的Uri.Builder()
.方案(“内容”)
.appendPath(CategoryTable.TB_名称)
.authority(“com.example.auth”)
.build();
返回新的游标装入器(this,uri,null,null,null,null);
}
一切正常,数据库中的值显示在listview上。但是假设我想在显示之前对这些值进行一些文本处理,我该怎么做呢


编辑1:我不想在主线程中进行文本处理。有没有办法使用从CursorLoader创建的AsynTaskLoader线程并卸载那里的工作?

是的。它被称为
ViewBinder
。在您的案例中,您需要一个
SimpleCursorAdapter.ViewBinder
。在将数据从适配器移动到视图时调用它


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

我通过扩展CursorLoader并仅重写
public Cursor loadInBackground(),创建了一个自定义加载程序。

通过这种方式,我检索数据,执行长时间运行的文本处理,将结果插入到新表中,并返回新表的游标

示例代码:

@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);
}
@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线程中的工作,完美地解决了我的问题。

实际上,我的文本处理可能需要时间。有没有办法在同一个AsyncTaskLoader线程上卸载工作。在某个异步线程上进行处理,并将结果存储在数据库中。你不能在视图绑定器中做昂贵的事情。我已经在DB中有了这些值,我正在从CursorLoader中检索它们,现在在读取这里的值时,我想做一些文本处理(我假设CursorLoader已经在某个线程中做了)。在我看来,文本处理不是一次性的事情。我想为数据库中的每一次读取做些什么。也许我还不清楚。您可以修改从光标到视图的内容。使用SimpleCorsorAdapter.ViewBinder。您不能在ViewBinder中执行任何昂贵的操作(复杂的文本处理)。如果您需要执行任何昂贵的操作,请预计算它,将其存储在数据库中,并使用加载程序/适配器将其放入视图中。然后,您可以使用w CursorWrapper,在工作线程中执行长任务,然后调用requery()或onChange()