CursorAdapter работает медленно на Android 4

У меня есть расширенный класс CursorAdapter, который дополняет список предложений данными из моей базы данных sqlite. До сих пор с андроидом 2.3 работало нормально, но сейчас в андроиде 4.0.1 чувствует себя очень медленно. Другое дело, во-вторых, что список предложений прокручивается тоже очень медленно. Есть ли известная проблема с CursorAdapter в Ice Cream Sandwich? Протестировано на устройстве Nexus S.

Редактировать:

Я изменил свой подход и попытался использовать CursorLoader, но по-прежнему требуется много времени, чтобы выполнить запрос и заполнить мой список автозаполнения.

при создании:

mSuggestionAdapter = new SimpleCursorAdapter(this,
            android.R.layout.simple_list_item_2, null,
            new String[] { "name_en", "pcode" },
            new int[] { android.R.id.text1, android.R.id.text2 }, 0);
    search_text.setAdapter(mSuggestionAdapter);

getLoaderManager().initLoader(0, null, this);

onTextChanged:

@Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            getLoaderManager().restartLoader(0, null, MapActivity.this);
        }

Интерфейс CursorLoader:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {

    Uri baseUri = SearchableProvider.CONTENT_URI;

    String select = DataBaseHelper.getWhereStatement(search_text.getText().toString());
    return new CursorLoader(this, baseUri,
            DataBaseHelper.SEARCHABLE_SUMMARY_PROJECTION, select, null,
            "name_en" );

    //return null;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    // TODO Auto-generated method stub
    mSuggestionAdapter.swapCursor(data);

}

@Override
public void onLoaderReset(Loader<Cursor> arg0) {
    // TODO Auto-generated method stub
    mSuggestionAdapter.swapCursor(null);
}

То же самое пробовал и с ArrayAdapter. Я получаю данные через некоторое время (20-30 секунд), но список из автозаполнения Textview не появляется.

Задержка возникает между onCreateLoader (асинхронно возвращает CursorLoader) и onLoadFinished().


person Vame    schedule 02.04.2012    source источник
comment
comment
Примечание. Я использую таблицу fts3 sqlite.   -  person Vame    schedule 02.04.2012


Ответы (1)


SimpleCursorAdapter устарел по тем же причинам. Google рекомендует использовать CursorLoader вместо SimpleCursorAdapter для большей скорости. ArrayAdapter тоже хорошая идея.

http://developer.android.com/reference/android/content/CursorLoader.html

person Mayank    schedule 02.04.2012
comment
Привет, спасибо за ваш ответ. Пожалуйста, проверьте мой отредактированный ответ выше. Я делаю что-то не так или неверно истолковал ваш ответ? - person Vame; 02.04.2012
comment
SimpleCursorAdapter не устарел, а загрузчики и адаптеры - это две совершенно разные вещи... - person Kuno; 04.11.2014