Wicket:ListView - 跳过一个项目

时间:2011-01-05 09:07:49

标签: java listview wicket

是否可以跳过populateItem()中的项目?例如通过在项目组件上设置某些内容,或其他任何内容。

ListView view = new ListView("quickLinks", quickLinks) {
    @Override
    protected void populateItem( ListItem item ){
        if( item.getModel(). /*something*/ )
                    item.skip()
    }
};

由于

3 个答案:

答案 0 :(得分:10)

我更愿意过滤我的模型而不是在视图中进行if / else检查。

在这里,使用这个抽象类:

public abstract class FilteredListModel<K> extends LoadableDetachableModel<List<K>>{

    private static final long serialVersionUID = 1L;
    private IModel<List<? extends K>> inner;

    @Override
    protected void onDetach(){
        inner.detach();
    }

    public FilteredListModel(IModel<List<? extends K>> inner){
        this.inner = inner;
    }
    public FilteredListModel(List<? extends K> inner){
        this.inner = Model.ofList(inner);
    }

    @Override
    protected final List<K> load(){
        List<? extends K> input = inner.getObject();
        List<K> result = new ArrayList<K>(input.size());
        for(K k : input){
            if(accept(k))result.add(k);
        }
        return result;
    }

    protected abstract boolean accept(K k);
}

现在将列表模型包装到其中:

ListView<String> view = new ListView<String>(
    "quickLinks",
    new FilteredListModel<String>(quickLinks){

      protected boolean accept(String value){
          return yourCheckHere();
      }

    }) {

    @Override
    protected void populateItem( ListItem<String> item ){
        // no ifs here
    }
};

答案 1 :(得分:2)

item.setVisible(false)不会有效吗?

答案 2 :(得分:1)

您可以覆盖ListView中的iterator()方法,以便只迭代您要呈现的项目。