Как подсчитать отображаемые строки в Richfaces DataTable с пользовательской фильтрацией?

#jsf #richfaces

#jsf #richfaces

Вопрос:

Я использую Richfaces 4.1.0 final, и я хочу подсчитать строки, отображаемые после фильтрации. Я использую пользовательские функции фильтрации:

 public Filter<?> getSessionNameFilterImpl() {
    Filter<Object> temp = new Filter<Object>() {
        @Override
        public boolean accept(Object item) {
            if (sessionNameFilter(item)) {
                return true;
            } else {
                filtered--; //counter for recording how many rows were denied
                return false;
            }
        }
    };
    return temp;
}

private boolean sessionNameFilter(Object item) {
    //filter implementation here
} 
  

Я пробовал со счетчиком (с именем ‘filtered’), но его значение не изменилось.

Комментарии:

1. Если у вас есть модель данных для datatable, то вы можете получить количество строк из модели с помощью dm.getRowCount(); . В этот момент фильтрация является внутренней операцией внутри модели данных, и вам не нужны никакие дополнительные функции. С вашим пользовательским фильтром rowCount = fullRowAmount — фильтруется.

2. В настоящее время я не использую DataModels, но я кажусь многообещающим. Не могли бы вы опубликовать ответ со ссылками на примеры?

Ответ №1:

 public Filter<?> getSessionNameFilterImpl() {
Filter<Object> temp = new Filter<Object>() {
    @Override
    public boolean accept(Object item) {
        if (sessionNameFilter(item)) {
           all.add(item);
            return true;
        } else {
          all.remove(item);
            return false;
        }
    }
};
return temp;
  

}

 public Integer getTotalShow(){
    return all.size();
}
  

частный набор all = новый HashSet();

Примечание: необходимо вызвать all.clear(); при обновлении источника таблицы данных.

Ответ №2:

Предполагая, list что ваш список объектов

Сбросьте счетчик в начале фильтра, увеличивайте счетчик каждый раз, когда объект фильтруется ( return false ), а затем отобразите размер списка минус filtered счетчик:

 ...

List<Object> list;
int filtered;

...

public Filter<?> getSessionNameFilterImpl() {
    filtered = 0;

    Filter<Object> temp = new Filter<Object>() {
        @Override
        public boolean accept(Object item) {
            if (sessionNameFilter(item)) {
                return true;
            } else {
                filtered  ; //counter for recording how many rows were denied
                return false;
            }
        }
    };
    return temp;
}

public int getRowCount(){
    return list.size()-filtered;
}