Как применить поиск по таблице ячеек GWT? - PullRequest
8 голосов
/ 15 сентября 2011

Я использую GWT 2.3. Я использую таблицу ячеек GWT. Ниже приведен код моей сотовой таблицы:

public class FormGrid extends SuperGrid {

List<Form> formList;


@Override
public void setColumns(CellTable table) {
    TextColumn<Form> nameColumn = new TextColumn<Form>() {
        @Override
        public String getValue(Form object) {
            return object.getName();
        }
    };
    table.addColumn(nameColumn, "Name");
}

@Override
public void setData() {
    if (formList != null && formList.size() > 0) {
        AsyncDataProvider<Form> provider = new AsyncDataProvider<Form>() {
            @Override
            protected void onRangeChanged(HasData<Form> display) {
                int start = display.getVisibleRange().getStart();
                int end = start + display.getVisibleRange().getLength();
                end = end >= formList.size() ? formList.size() : end;
                List<Form> sub = formList.subList(start, end);
                updateRowData(start, sub);
            }
        };
        provider.addDataDisplay(getTable());
        provider.updateRowCount(formList.size(), true);
    }
}

public List<Form> getFormList() {
    return formList;
}

public void setFormList(List<Form> formList) {
    this.formList = formList;
}

}

В этом столбце мои набор и данные набора будут называться для потока суперкласса. Эта таблица ячеек работает нормально. Теперь я хочу поместить средство типа фильтра (например, поиск) в эту таблицу ячеек. Это должно быть похоже на текстовое поле над таблицей ячеек, и то, что когда-либо было написано в этом текстовом поле, должно запускать одинаковый запрос ко всем именам форм. для этого значения текстового поля.

например, у меня есть форма 1000 в сетке. Теперь, если пользователь пишет 'app' в текстовом поле фильтра над таблицей ячеек, все формы, в которых есть имя 'app', будут отфильтрованы, и сетка будет иметь только эти формы. ,

Это первый случай:

В другом случае я отображаю только один столбец в имени сетки. У меня есть еще два свойства в форме (описание, тег). Но я не отображаю их. Теперь для фильтра, если пользователь пишет «приложение» в поле фильтра, тогда оно должен выполнить запрос ко всем трем (имя, описание и тег) и должен вернуть, если «приложение» соответствует любому из трех.

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

Ответы [ 2 ]

4 голосов
/ 15 сентября 2011

Вы можете найти реализацию в образце затрат .

Вот краткое изложение шагов

1.) Создайте текстовое поле и кнопку поиска.
2.) добавьте clickHandler к кнопке поиска (вы также можете добавить KeyUpHandler кТекстовое поле в качестве альтернативы)

searchButton.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {
        search();
    }
});

3.) В функции поиска найдите searchString и сохраните ее.

private void search() {
    searchString = searchBox.getText();
    setData();
  }

4.) Измените функцию setdata (), чтобы учитывать searchString

@Override
public void setData() {
    if (formList != null && formList.size() > 0) {
        AsyncDataProvider<Form> provider = new AsyncDataProvider<Form>() {
            @Override
            protected void onRangeChanged(HasData<Form> display) {
                int start = display.getVisibleRange().getStart();
                int end = start + display.getVisibleRange().getLength();
                //new function if searchString is specified take into account
                List<Form> sub = getSubList(start,end);
                end = end >= sub.size() ? sub.size() : end;
                updateRowData(sub.subList(start, end);, sub);
            }
        };
        provider.addDataDisplay(getTable());
        provider.updateRowCount(formList.size(), true);
    }
}

private List<Form> getSubList(int start, int end) {
    List<Form> filtered_list = null;
    if (searchString != null) {
        filtered_list= new ArrayList<Form>();
        for (Form form : formList) {
            if (form.getName().equals(searchString) || form.getTag().equals(searchString) || form.getDescription().equals(searchString))
                filtered_list.add(form);                
        }
    }
    else 
        filtered_list = formList;
   return filtered_list;
}
2 голосов
/ 24 ноября 2011

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

Видео в этом посте показывает его в действии.

Вот часть кода поставщика данных пользовательского списка, которую вы должны реализовать.

    @Override  
protected void updateRowData(HasData display, int start, List values) {  
    if (!hasFilter() || filter == null) { // we don't need to filter, so call base class  
        super.updateRowData(display, start, values);  
    } else {  
        int end = start + values.size();  
        Range range = display.getVisibleRange();  
        int curStart = range.getStart();  
        int curLength = range.getLength();  
        int curEnd = curStart + curLength;  
        if (start == curStart || (curStart < end && curEnd > start)) {  
            int realStart = curStart < start ? start : curStart;  
            int realEnd = curEnd > end ? end : curEnd;  
            int realLength = realEnd - realStart;  
            List<t> resulted = new ArrayList<t>(realLength);  
            for (int i = realStart - start; i < realStart - start + realLength; i++) {  
                if (filter.isValid((T) values.get(i), getFilter())) {  
                    resulted.add((T) values.get(i));  
                }  
            }  
            display.setRowData(realStart, resulted);  
            display.setRowCount(resulted.size());  
        }  
    }  
}  
...