Java Wicket:ListView-跳过项目

Java Wicket:ListView-跳过项目,java,listview,wicket,Java,Listview,Wicket,是否可以跳过populateItem()中的项目?e、 g.通过在项目组件上设置某些内容,或其他方式 ListView view = new ListView("quickLinks", quickLinks) { @Override protected void populateItem( ListItem item ){ if( item.getModel(). /*something*/ ) item.skip()

是否可以跳过
populateItem()
中的项目?e、 g.通过在项目组件上设置某些内容,或其他方式

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

谢谢

您可以覆盖
列表视图中的方法
,以便只迭代您希望呈现的项目。

我更喜欢筛选我的模型,而不是在视图中执行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);
}
公共抽象类FilteredListModel扩展了LoadableDetachableModel{
私有静态最终长serialVersionUID=1L;

私有IModel无法
item.setVisible(false)
work?

我无法再次找到这些信息,但我隐约记得Wicket 1.5将为
ListView
s等+1合并一个更通用的呈现/迭代模型,但实现迭代器是困难的。如果您愿意,我建议您使用一些帮助器方法,如s或类似的方法,这是可靠的吗?我的意思是,Wicket永远不会以其他方式访问项目?@OndraŽIžka我不确定Wicket是否能保证这一点。如果不这样做,您是在视图上过滤,而不是在modelSure上过滤,但您仍然必须在项目内创建组件(否则Java树与HTML树不匹配)。我不想创建永远不会使用的组件。但这只是服务器上的短期内存。html不会被呈现-或者我错了吗?是的,但我从后端提供了一个列表,其中包含各种混合类型的实体,随着时间的推移可能会被添加。我的组件只能呈现其中的一些。我知道,不是quite很好,但后端对我来说就是这样。这确实有效,而且您不必在调用后创建层次结构,wicket不会抱怨。我认为这是最简单和首选的方法。很好,我想我会在我的wicket 1.4应用程序中使用它。谢谢!很好的解决方案-也是通用的-直接用于我的Utils;)
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
    }
};