更新Sqlite数据库游标时,ListView经常挂起

时间:2016-12-15 16:51:34

标签: android sqlite listview parallel-processing cursor

我有一个EditText,用于获取用户输入。一旦用户输入某些数据,与EditText相关联的文本更改侦听器将调用刷新的游标,并尝试更新显示在ListView中的结果,该结果位于下方。

一切都很好。但是,无论何时发生搜索查询中的任何更改,结果光标和ListView更新都需要一些时间,例如 n 秒。在 n 秒的这段时间内,UI停止(暂停/挂起您可能调用的任何内容),并且在刷新的游标可用并且填充整个ListView之前不会响应。

当我尝试将光标更新放在不同的线程中时,它不允许在UI中反映这一点,因为UI线程不允许其他线程在操作中进行命令。任何UI活动(例如列表更新)都必须通过runOnUiThread类中的MainActivity来实现。

请建议我允许用户修改EditText的方式以及刷新ListView的更新游标,而不会影响前者。

1 个答案:

答案 0 :(得分:0)

基本上,你正在尝试错误的方法。当我们希望列表的数据直接来自SQLite数据库查询时,我们可以使用CursorAdapter。

创建适配器

public class MyCursorAdapter extends CursorAdapter {

    // Default constructor
    public MyCursorAdapter(Context context, Cursor cursor, int flags) {
        ...
    }

    public void bindView(View view, Context context, Cursor cursor) {
        ...
    }

    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        ...
        return null;
    }
}

Get Values from database
Cursor todoCursor = db.rawQuery("SELECT  * FROM todo_items", null);

现在,我们可以使用Activity中的CursorAdapter将一组项目显示到ListView中:

// Find ListView to populate
ListView lvItems = (ListView) findViewById(R.id.lvItems);
// Setup cursor adapter using cursor from last step
TodoCursorAdapter todoAdapter = new TodoCursorAdapter(this, todoCursor);
// Attach cursor adapter to the ListView 
lvItems.setAdapter(todoAdapter);
This will then trigger the CursorAdapter iterating through the result set and populating the list. We can change the cursor to update the adapter at any time with:

// Switch to new cursor and update contents of ListView
todoAdapter.changeCursor(newCursor);