У меня странное поведение в моем приложении, которое я изо всех сил пытаюсь понять. У меня есть 2 списка (A и B), начальный вид - это список A с текстовым полем сверху, которое фильтрует результаты списка B.
Я использую загрузчики курсоров, адаптеры и список для реализации этих двух списков.
Когда пользователь вводит ключевое слово для поиска, я перезапускаю загрузчик B с введенным ключевым словом, загружаю его в адаптер и настраиваю список для отображения адаптера B.
Все работает нормально, НО вместо того, чтобы отображать результаты сразу, происходит неправильное поведение: полный список B отображается на долю секунды, затем отображаются отфильтрованные результаты. Конечно, это создает очень плохой UX (пользовательский опыт), чего я хочу добиться здесь, так это то, что отфильтрованные результаты будут отображаться сразу же, без доли секунды просмотра полного списка B.
Я действительно хочу понять, почему такое поведение происходит ... в конце концов, этот стиль реализации запросов - это тот, который используется в официальном примере загрузчиков курсоров :)
Код слишком большой, но это наиболее важные части: это onTextChange, который приводит к плохому поведению:
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
getLoaderManager().restartLoader(LOADER_ID_2, null, this);
}
Это методы cursorLoader:
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
if (id== LOADER_ID_1)
{
//calculate and return cursorLoader
}
else
{
if (mFilter == null || mFilter.length() == 0)
{
return new CursorLoader(this, uri, CAdapter.PROJECTION, null,null,null);
}
//else
// do some calculations
return new CursorLoader(this,uri, CAdapter.PROJECTION, whereStmt, whereArgs, orderBy);
}
}
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (loader.getId()== LOADER_ID_2)
{
mCAdapter.swapCursor(cursor);
}
else if (loader.getId()== LOADER_ID_1)
{
MatrixCursor newCursor = new MatrixCursor(DAdapter.PROJECTION);
if (cursor.moveToFirst()) {
do {
// basically I'm grouping filtering the returned cursor and populating the new matrix cursor with the filtered data because I didn't find a better way to filter and group results (get distinct rows)
}while (cursor.moveToNext());
}
mDAdapter.changeCursor(newCursor);
//I used change cursor because the cursor loader will only handle closing the "cursor" and not the "newCursor" I created and put into the adapter, I hope this doesn't backfire :)
}
public void onLoaderReset(Loader<Cursor> loader) {
if (loader.getId()== LOADER_ID_2 )
mCAdapter.swapCursor(null);
else if (loader.getId()== LOADER_ID_1 )
mDAdapter.swapCursor(null);
}