我正在使用GWT 2.3.I我正在使用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;
}
}
在此我的set列和set数据将被调用来自super class flow.This cell table工作正常。 现在我想在这个单元格表中放置一个过滤器类型工具(比如搜索)。应该是这样的,单元格表上方有一个texbox,并且在该文本框中写了什么,它应该对所有表单名称进行类似的查询对于该文本框值。
例如我在网格中有1000个表单。现在,如果用户在单元格表格上方的某个过滤器文本框中写入“app”,则会过滤出名称中包含“app”的所有表单,并且网格仅包含这些表单。
这是第一种情况:
另一种情况是我只在网格名称中呈现一列。我在表单中有两个属性(描述,标记)。但我没有渲染它们。如果用户在过滤器框中写入'app'然后它就过滤应该对所有三个(名称,描述和标记)进行查询,如果'app'与三个中的任何一个匹配,则应该返回。
我没有得到如何在单元格表中应用过滤器。 请帮帮我。谢谢。
答案 0 :(得分:4)
您可以在expenses示例中找到实现。
以下是步骤的简短摘要
1。)创建一个文本框和一个SearchButton 2.)将clickHandler添加到SearchButton(您也可以将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;
}
答案 1 :(得分:2)
可以提出另一种解决方案,可以很容易地多次使用。 想法是为您的celltable创建自定义提供程序。 GWT celltable filtering
这篇文章中的Video显示了它的实际效果。
以下是您必须实现的自定义列表数据提供程序的代码部分。
@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());
}
}
}