Фильтрация данных на уровне адаптера VS на уровне sql-запроса.
При работе с базой данных иногда нужно отсеять часть информации.
Например, в моей проге по долгам есть опция "показывать нулевой баланс" - т.е. все записи с нулевым балансом либо отображать либо нет.
У меня это было сделано на уровне запроса к базе - в зависимости от опции добавлял параметр.
Однако, мне также нужно хранить информацию обо всех контактах, включая тех, кого скрыли из-за нулевого баланса. (Например, все контакты должны быть доступны в фильтре контактов в истории и в автоподстановке при вводе имени.)
В итоге пришлось делать ещё один запрос, выгребающий все контакты.
Но сегодня пришла идея - отсеивать "нулевые" записи в адаптере, который выводит информацию на экран (CursorAdapter).
Для этого добавляем в адаптер 2 метода:
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
if (isShowZeroBalance)
return TYPE_NORMAL;
long balance = extractBalanceAt(position); // достаём баланс из курсора
return (balance == 0) ? TYPE_EMPTY : TYPE_NORMAL;
}
далее в методе
public View newView(Context context, Cursor cursor, ViewGroup parent)
делаем проверку типа, если TYPE_NORMAL, то создаём элемент как и раньше, а
иначе создаём пустой лэйаут размером 0х0 dp.
И в методе
public void bindView(View view, Context context, final Cursor cursor)
в самом начале делаем проверку
int type = getItemViewType(cursor.getPosition());
if (type == TYPE_EMPTY) {
return;
}
Получаем тот же итоговый результат, но без лишнего запроса к базе.
И наш единожды запрошенный курсор хранит информацию обо всех контактах в таблице, можем использовать его для любых нужд.