Фильтрация Cursor Loaders, старые данные отображаются в течение доли секунды

У меня странное поведение в моем приложении, которое я изо всех сил пытаюсь понять. У меня есть 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);
    }



Ответы (1)


Попробуй это;

public Loader<Cursor> onCreateLoader(int id, Bundle args) 
{
Loader<Cursor> cursorLoader
if (id== LOADER_ID_1)
{
//calculate and return cursorLoader
If(cursorLoader == null)
{
return new CursorLoader(this,uri,

CAdapter.PROJECTION, гдеStmt, гдеArgs, orderBy); }//конец внутри, если

}// end if 
else if (mFilter == null || mFilter.length() == 0) 
{
return new CursorLoader(this, uri, CAdapter.PROJECTION, null,null,null);

}// конец else if
}// конец метода

person Want2bExpert    schedule 07.08.2015
comment
Я не уверен, насколько это актуально. Не могли бы вы объяснить, чего вы пытаетесь достичь? - person KaBoZ; 15.08.2015
comment
байты? тег изображения? .json в тосте? Я думаю, вы перепутали мой вопрос с другим :) - person KaBoZ; 16.08.2015
comment
@kaBoz Приношу свои извинения, этот комментарий предназначен для другого вопроса. Я удаляю его сейчас, и помог ли вам ответ, который я дал? - person Want2bExpert; 16.08.2015
comment
Я добавил комментарий, но почему-то его сейчас нет. В любом случае, я просто говорил вам проверить мой предыдущий комментарий, когда вы разместили свой код: я не уверен, насколько это актуально. Не могли бы вы объяснить, чего вы пытаетесь достичь? - person KaBoZ; 20.08.2015
comment
Извините, я не понял. Я пытался проверить, возвращается ли какой-либо курсор, если LOADER_ID = 1, иначе запустите новый загрузчик. Я думаю, что из-за того, что вы возвращаете null в конце, может быть, почему данные отображаются, а затем исчезают, если я прав. - person Want2bExpert; 20.08.2015