0

我想通过 RPC 接收键入的列表,然后将其链接到 ListDataProvider。然后 ListDataProvider 必须在 CellTable 中显示此列表。但是我从 RPC 获得的 List 并没有出现在 CellTable 中。我创建了一个没有 RPC 的简单列表并将其链接到 ListDataProvider。此列表已成功显示。在调试器的帮助下,我发现了这两个列表(变量)之间的区别:

  • 从 RPC 得到的变量结构是 elementData->[0],[1],...
  • 简单 List 的变量结构是list ->elementData->[0],[1],...

这里我通过 RPC 发送列表:

public List<Pravform> greetServer(String input) throws IllegalArgumentException {
...
TypedQuery<Pravform> query = em.createQuery("SELECT p FROM Pravform p",Pravform.class);
List<Pravform> categoryList = query.getResultList();
return categoryList; 
}

在这里,我将 List 链接到 ListDataProvider。

public void onSuccess(List<Pravform> result) {
List<Pravform> listPf = dataProvider.getList();
listPf = result;        
}

请告诉我,我做错了什么?

4

1 回答 1

0

问题在于 DataListProvider 的工作方式。你基本上只是询问它的数据列表,然后你修改这个列表。所以在 onSuccess 中,你要求 dataProvider 给你它的 List,它在其中存储它的数据。您将对该列表的引用存储在 listPf 中。但之后,您将完全不同的 List 分配给 listPf。所以在这一步之前,listPf 指向存储在表中的相同数据(listPf -> 表中包含数据的列表)。但之后它指向来自 RPC 的数据(listPf -> result)。很明显,您在 CellTable 中看不到数据的任何更改,因为您没有更改它们。

解决方案应该是,将 onSuccess 中的新列表设置为 DataListProvider(我必须承认我没有尝试过)

dataProvider.setList(result);

或者只使用您的 dataProvider 提供的列表(就像我一样)

public void greetServer(String input, List listFromDataProvider) throws IllegalArgumentException {
...
TypedQuery<Pravform> query = em.createQuery("SELECT p FROM Pravform p",Pravform.class);
listFromDataProvider.addAll(query.getResultList());
}

当您从 RPC 调用此方法时,请使用

greetServer("someInput", dataProvider.getList())
于 2013-06-10T16:05:38.913 回答