Одним из преимуществ, которые я думал о использовании CursorLoaders и Loadermanagers, было то, что вам не нужно вручную управлять жизненным циклом курсора. Поэтому я использовал loadermanager для привязки адаптера к AutoCompleteTextView с помощью пакета поддержки.IllegalStateException - поддержка LoaderManager с AutocompleteTextView
Он работает достаточно хорошо, за исключением того, что он случайно выдает сообщение об ошибке «IllegalStateException - попытка повторного открытия уже закрытого объекта». Неужели это не должно произойти, если мы используем диспетчер загрузчика?
Вот код:
package com.bhagwad.tennis;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import com.bhagwad.tennis.TennisSchedule.TennisScheduleColumns;
public class WidgetConfiguration extends FragmentActivity implements OnClickListener, LoaderCallbacks<Cursor> {
Button mSaveWidget;
AutoCompleteTextView mPlayerName;
int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
String mSelection ="";
SimpleCursorAdapter mAdapter;
public static String PREFS = "com.bhagwad.tennis.appwidget";
public static final String PREFS_PREFIX_KEY = "prefix_";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.widget_configuration);
mPlayerName = (AutoCompleteTextView) findViewById(R.id.edit_filter);
mPlayerName.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!s.equals(""))
mSelection = s.toString();
else
mSelection = "";
getSupportLoaderManager().restartLoader(0, null, WidgetConfiguration.this);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
// Set up the adapter
mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, null, new String[] {TennisScheduleColumns.PLAYER_NAME}, new int[] {android.R.id.text1}, 0);
mAdapter.setCursorToStringConverter(new CursorToStringConverter() {
@Override
public CharSequence convertToString(Cursor c) {
return c.getString(c.getColumnIndexOrThrow(TennisScheduleColumns.PLAYER_NAME));
}
});
mPlayerName.setAdapter(mAdapter);
getSupportLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
return new CursorLoader(this, TennisScheduleColumns.CONTENT_URI_PLAYERS, new String[] {TennisScheduleColumns._ID, TennisScheduleColumns.PLAYER_NAME}, TennisScheduleColumns.PLAYER_NAME + " LIKE ?", new String[] {"%"+mSelection+"%"}, null);
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
mAdapter.swapCursor(null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
mAdapter.swapCursor(data);
}
}
Вот стек ошибка:
08-16 22:21:23.244: E/AndroidRuntime(25475): java.lang.IllegalStateException: attempt to re-open an already-closed object: android.database.sqlite.SQLiteQuery (mSql = SELECT _id, player_name FROM players WHERE (player_name LIKE ?))
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:33)
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:82)
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:164)
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.database.sqlite.SQLiteCursor.onMove(SQLiteCursor.java:147)
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:178)
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.database.CursorWrapper.moveToPosition(CursorWrapper.java:162)
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.support.v4.widget.CursorAdapter.getItem(CursorAdapter.java:213)
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.widget.AutoCompleteTextView.buildImeCompletions(AutoCompleteTextView.java:1113)
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.widget.AutoCompleteTextView.showDropDown(AutoCompleteTextView.java:1072)
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.widget.AutoCompleteTextView.updateDropDownForFilter(AutoCompleteTextView.java:950)
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.widget.AutoCompleteTextView.onFilterComplete(AutoCompleteTextView.java:932)
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:285)
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.os.Handler.dispatchMessage(Handler.java:99)
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.os.Looper.loop(Looper.java:137)
08-16 22:21:23.244: E/AndroidRuntime(25475): at android.app.ActivityThread.main(ActivityThread.java:4507)
Любые идеи о том, что может быть не так?
Хотя у меня до сих пор нет решения, я просто расширил AutoCompleteTextView, обнаружил ошибку в onFilterComplete в цикле try/catch, окружающем оператор «super», проигнорировал его и перешел. Я понятия не имею, почему это произошло или как с этим справиться. Задача решена. Хотя грязно. Понравилось бы более элегантное решение. –
Я делаю что-то подобное ЗДЕСЬ !! http://stackoverflow.com/questions/12854336/autocompletetextview-backed-by-cursorloader – toobsco42
@BhagwadJalPark Я решил эту проблему, как и вы. Решение, предложенное Тони (проверка закрытого состояния в OnLoadFinished), не помогло мне. Вот класс обертки, который я написал для вашей проницательности: https://gist.github.com/esilverberg/5606551 – esilver