Показать сообщение отдельно
Старый 31.01.2016, 17:02   #7
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Полезные находки

Фильтрация данных на уровне адаптера 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 contextCursor cursorViewGroup parent
делаем проверку типа, если TYPE_NORMAL, то создаём элемент как и раньше, а иначе создаём пустой лэйаут размером 0х0 dp.
И в методе
public void bindView(View viewContext context, final Cursor cursor
в самом начале делаем проверку
int type getItemViewType(cursor.getPosition());
if (
type == TYPE_EMPTY) {
    return;

Получаем тот же итоговый результат, но без лишнего запроса к базе.
И наш единожды запрошенный курсор хранит информацию обо всех контактах в таблице, можем использовать его для любых нужд.

Последний раз редактировалось Жека, 31.01.2016 в 19:55. Причина: добавил инфу о том, что нужно создавать пустую вьюху для нулевых балансов
(Offline)
 
Ответить с цитированием