primefaces dataTable使用List而不是Array进行多项选择

时间:2012-06-02 15:06:06

标签: arrays jsf-2 datatable primefaces multipleselection

我想获得这个:

<h:form id="form">

    <p:dataTable value="#{testBean.allItems}" var="item" selection="#{testBean.category.itemList}" selectionMode="multiple">
        <p:column>#{item.name}</p:column>
    </p:dataTable>

</h:form>

,其中

@ManagedBean
public class TestBean
{
    private static List<Item> itemDB = new ArrayList<Item>();
    static
    {
        itemDB.add(new Item("zero"));
        itemDB.add(new Item("one"));
        itemDB.add(new Item("two"));
        itemDB.add(new Item("three"));
        itemDB.add(new Item("four"));
        itemDB.add(new Item("five"));
    }

    private Category category;

    @PostConstruct
    public void init()
    {
        category = new Category();
        category.setName("root");
        category.getItemList().add(itemDB.get(2));
        category.getItemList().add(itemDB.get(3));
    }

    public List<Item> getAllItems()
    {
        return itemDB;
    }

    public Category getCategory()
    {
        return category;
    }

    public void setCategory(Category category)
    {
        this.category = category;
    }
}

我认为我的选择是:

  1. 创建一种从List到Array的翻译器,反之亦然,但我有一个关于使它与ValueExpressions一起工作的headeache ......
  2. 扩展PrimeFaces DataTable和DataTableRenderer但是弄清楚可能真的很痛苦
  3. 有什么好主意吗?

3 个答案:

答案 0 :(得分:0)

对于这种情况,Collections-API有一些相对简单的方法。

Item[] itemArr = itemDB.toArray(new Item[0]);

itemDB = Arrays.asList(itemArr);

答案 1 :(得分:0)

这就是我的做法。到目前为止,我还没有对它进行过大量的测试,但它似乎确实有效。我认为Primefaces的补丁可能是更好的解决方案。

以下是我想要使用的列表方法:

   public List<R> getSelectionRecordList() {
        return selectionItems;
    }

    public void setSelectionRecordList(List<R> selectionItems) {
        this.selectionItems = selectionItems;
    }

这是我为访问该列表而添加的两个额外数组方法。

       public R[] getSelectionRecordArray() {
           if (null == selectionItems) {
               return null;
           }
            return (R[]) selectionItems.toArray();
        }

        public void setSelectionRecordArray(R[] selectionArray) {
            if (null == selectionArray || selectionArray.length == 0) {
                selectionItems = null;
            } else {
                selectionItems = new ArrayList<R>(selectionArray.length);
                for (R record : selectionArray) {
                    this.selectionItems.add(record);
                }
            }
        }

答案 2 :(得分:0)

我用我自己的班级扩展了主要DataTable