2016-12-15 2 views
0

У меня есть один EditText, который используется для ввода пользовательского ввода. Как только пользователь вводит определенные данные, прослушиватель смены текста, связанный с EditText, вызывает обновленный курсор и пытается обновить результат, который отображается в ListView, расположенный ниже.ListView часто зависает, когда обновляется курсор базы данных Sqlite.

Все в порядке. Но всякий раз, когда происходит какое-либо изменение в поисковом запросе, результирующий курсор и обновление ListView занимает некоторое время, скажем, около n секунд. Во время этого промежутка n секунд пользовательский интерфейс останавливается (останавливает/зависает, что вы можете вызвать) и не отвечает до тех пор, пока не будет обновлен курсор и не будет заполнен весь ListView.

Когда я попытался поместить обновление курсора в другой поток, он не позволял отражать его в пользовательском интерфейсе, поскольку пользовательский интерфейс не позволяет командовать другими потоками в действии. Любой пользовательский интерфейс, такой как обновление списка, должен быть реализован через runOnUiThread в классе MainActivity.

Просьба предлагать способы, с помощью которых я могу разрешить изменение EditText пользователем, а также обновленный курсор, обновляющий ListView, без ущерба для первого.

ответ

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); 

Теперь мы можем использовать 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); 
+0

Я использовал CursorAdaptor и в методе BindView , Я сделал все, что нужно сделать. Но все же во время получения результата для заданного запроса, который возвращает 400 строк, требуется определенное время, в течение которого другие функции пользовательского интерфейса находятся в зависании. –

+0

Вы использовали textChangeListner ??? –

+0

Используйте obsever содержимого для отражения изменений в представлении. 400 записей не имеет значения. Вы можете использовать лимит и разбивку на страницы –

Смежные вопросы