在p:datatable中使用自定义集合

时间:2015-01-28 09:06:26

标签: java jsf-2 primefaces

我正在尝试为我的p:datatable

使用自定义集合

自定义收藏:

public class ManagedArrayList<E> extends java.util.ArrayList<E> {

private static final int DEFAULT_SIZE_LIMIT = 0; //unlimited
private ArrayList<E> internalList;
private int maxSize;

public ManagedArrayList(int maxSize) {
    this.maxSize = maxSize;
    internalList = new ArrayList<E> ();
}

public ManagedArrayList() {
    this(DEFAULT_SIZE_LIMIT);
}

@Override
public boolean add(E objectToAdd){
    if(maxSize>0){
        if(internalList.size()>maxSize){
            throw new IllegalStateException("List is full");
        }
    }
    return internalList.add(objectToAdd);
}

@Override
public E get(int index){
    return internalList.get(index);
}

@Override
public E remove(int index){
    return internalList.remove(index);
}

@Override
public boolean remove(Object o){
    return internalList.remove(o);
}

@Override
public Iterator<E> iterator(){
    return internalList.iterator();
}

public List<E> toList(){
    return (List)internalList;
}
}

然而,当我按原样使用时,我收到消息:“找不到记录。” 如果我首先将自定义列表转换​​为<List>,则可以正常工作。 转换我的清单:

private ManagedArrayList<FragmentTuple> fragments = new ManagedArrayList();

public List<FragmentTuple> getUICompatibleFragments() {
    List<FragmentTuple> f = this.fragments.toList();
    return f;
}

我会优先直接使用我的自定义集合而无需转换。我在ManagedArrayList的实现中是否缺少某些内容,以便它可以在p:datatable中工作,最好也在ui中重复:repeat

1 个答案:

答案 0 :(得分:0)

您忘了覆盖size()isEmpty()方法。此外,您永远不会委托ArrayList超类,而是保留内部ArrayList实例。有人会想知道你为什么要从ArrayList延伸而不是AbstractList甚至List,这反过来会自动迫使你实施正确的方法。因此,另一种方法是委派给ArrayList超类而不是内部实例,以便size()isEmpty()调用“自动”返回正确的值。